Google は、黒人コミュニティのための人種的公平の促進に取り組んでいます。詳細をご覧ください。

AppleプラットフォームでOpenIDConnectを使用して認証する

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

IdentityPlatformを使用したFirebaseAuthenticationにアップグレードした場合は、選択したOpenID Connect(OIDC)準拠のプロバイダーを使用してFirebaseでユーザーを認証できます。これにより、FirebaseでネイティブにサポートされていないIDプロバイダーを使用できるようになります。

あなたが始める前に

OIDCプロバイダーを使用してユーザーにサインインするには、最初にプロバイダーからいくつかの情報を収集する必要があります。

  • クライアントID :アプリを識別するプロバイダーに固有の文字列。プロバイダーは、サポートするプラットフォームごとに異なるクライアントIDを割り当てる場合があります。これは、プロバイダーによって発行されたIDトークンのaudクレームの値の1つです。

  • クライアントシークレット:プロバイダーがクライアントIDの所有権を確認するために使用するシークレット文字列。クライアントIDごとに、一致するクライアントシークレットが必要になります。 (この値は、認証コードフローを使用している場合にのみ必要です。これを強くお勧めします。)

  • 発行者:プロバイダーを識別する文字列。この値は、/。 /.well-known/openid-configurationを追加すると、プロバイダーのOIDC検出ドキュメントの場所となるURLである必要があります。たとえば、発行者がhttps://auth.example.comの場合、検出ドキュメントはhttps://auth.example.com/.well-known/openid-configurationで利用可能である必要があります。

上記の情報を入手したら、FirebaseプロジェクトのサインインプロバイダーとしてOpenIDConnectを有効にします。

  1. iOSプロジェクトにFirebaseを追加します

  2. IdentityPlatformを使用したFirebaseAuthenticationにアップグレードしていない場合は、アップグレードしてください。 OpenID Connect認証は、アップグレードされたプロジェクトでのみ使用できます。

  3. Firebaseコンソールの[ログインプロバイダー]ページで、[新しいプロバイダーの追加]をクリックし、[ OpenIDConnect ]をクリックします。

  4. 承認コードフローを使用するか、暗黙的な許可フローを使用するかを選択します。

    プロバイダーがサポートしている場合は、常にコードフローを使用する必要があります。暗黙のフローは安全性が低く、使用することは強くお勧めしません。

  5. このプロバイダーに名前を付けます。生成されたプロバイダーIDに注意してください: oidc.example-providerようなもの。アプリにログインコードを追加するときに、このIDが必要になります。

  6. クライアントIDとクライアントシークレット、およびプロバイダーの発行者文字列を指定します。これらの値は、プロバイダーが割り当てた値と正確に一致する必要があります。

  7. 変更を保存します。

FirebaseSDKを使用してログインフローを処理する

OIDCプロバイダーを使用してFirebaseでユーザーを認証する最も簡単な方法は、FirebaseSDKでログインフロー全体を処理することです。

Firebase AppleプラットフォームSDKでサインインフローを処理するには、次の手順に従います。

  1. XcodeプロジェクトにカスタムURLスキームを追加します。

    1. プロジェクト構成を開きます。左側のツリービューでプロジェクト名をダブルクリックします。 [ターゲット]セクションからアプリを選択し、[情報]タブを選択して、[ URLタイプ]セクションを展開します。
    2. [ + ]ボタンをクリックして、逆にしたクライアントIDのURLスキームを追加します。この値を見つけるには、 GoogleService-Info.plist構成ファイルを開き、 REVERSED_CLIENT_IDキーを探します。そのキーの値をコピーして、構成ページの[ URLスキーム]ボックスに貼り付けます。他のフィールドは空白のままにします。

      完了すると、構成は次のようになります(ただし、アプリケーション固有の値を使用)。

  2. Firebaseコンソールで取得したプロバイダーIDを使用して、 OAuthProviderのインスタンスを作成します。

    迅速

    var provider = OAuthProvider(providerID: "oidc.example-provider")
    

    Objective-C

    FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"oidc.example-provider"];
    
  3. オプション:OAuthリクエストで送信する追加のカスタムOAuthパラメーターを指定します。

    迅速

    provider.customParameters = [
      "login_hint": "user@example.com"
    ]
    

    Objective-C

    [provider setCustomParameters:@{@"login_hint": @"user@example.com"}];
    

    サポートされているパラメーターについては、プロバイダーに確認してください。 setCustomParametersを使用してFirebaseに必要なパラメータを渡すことはできないことに注意してください。これらのパラメーターは、 client_idresponse_typeredirect_uristatescope 、およびresponse_modeです。

  4. オプション:認証プロバイダーに要求する基本プロファイル以外の追加のOAuth2.0スコープを指定します。

    迅速

    provider.scopes = ["mail.read", "calendars.read"]
    

    Objective-C

    [provider setScopes:@[@"mail.read", @"calendars.read"]];
    

    サポートされているスコープについては、プロバイダーに確認してください。

  5. オプション:reCAPTCHAをユーザーに表示するときにアプリがSFSafariViewControllerまたはUIWebViewを表示する方法をカスタマイズする場合は、 FIRAuthUIDelegateプロトコルに準拠するカスタムクラスを作成します。

  6. OAuthプロバイダーオブジェクトを使用してFirebaseで認証します。

    迅速

    // If you created a custom class that conforms to AuthUIDelegate,
    // pass it instead of nil:
    provider.getCredentialWith(nil) { credential, error in
      if error != nil {
        // Handle error.
      }
      if credential != nil {
        Auth().signIn(with: credential) { authResult, error in
          if error != nil {
            // Handle error.
          }
          // User is signed in.
          // IdP data available in authResult.additionalUserInfo.profile.
          // OAuth access token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.accessToken
          // OAuth ID token can also be retrieved:
          // (authResult.credential as? OAuthCredential)?.idToken
        }
      }
    }
    

    Objective-C

    // If you created a custom class that conforms to AuthUIDelegate,
    // pass it instead of nil:
    [provider getCredentialWithUIDelegate:nil
                                completion:^(FIRAuthCredential *_Nullable credential, NSError *_Nullable error) {
      if (error) {
        // Handle error.
      }
      if (credential) {
        [[FIRAuth auth] signInWithCredential:credential
                                  completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) {
          if (error) {
            // Handle error.
          }
          // User is signed in.
          // IdP data available in authResult.additionalUserInfo.profile.
          // OAuth access token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).accessToken
          // OAuth ID token can also be retrieved:
          // ((FIROAuthCredential *)authResult.credential).idToken
        }];
      }
    }];
    
  7. 上記の例はサインインフローに焦点を当てていますが、linkWithCredentialを使用してlinkWithCredentialプロバイダーを既存のユーザーにリンクすることもできます。たとえば、複数のプロバイダーを同じユーザーにリンクして、どちらかでサインインできるようにすることができます。

    迅速

    Auth().currentUser.link(withCredential: credential) { authResult, error in
      if error != nil {
        // Handle error.
      }
      // OIDC credential is linked to the current user.
      // IdP data available in authResult.additionalUserInfo.profile.
      // OAuth access token can also be retrieved:
      // (authResult.credential as? OAuthCredential)?.accessToken
      // OAuth ID token can also be retrieved:
      // (authResult.credential as? OAuthCredential)?.idToken
    }
    

    Objective-C

    [[FIRAuth auth].currentUser
        linkWithCredential:credential
                completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
      if (error) {
        // Handle error.
      }
      // OIDC credential is linked to the current user.
      // IdP data available in authResult.additionalUserInfo.profile.
      // OAuth access token can also be retrieved:
      // ((FIROAuthCredential *)authResult.credential).accessToken
      // OAuth ID token can also be retrieved:
      // ((FIROAuthCredential *)authResult.credential).idToken
    }];
    
  8. 同じパターンをreauthenticateWithCredentialで使用できます。これを使用して、最近のログインを必要とする機密性の高い操作の新しい資格情報を取得できます。

    迅速

    Auth().currentUser.reauthenticateWithCredential(withCredential: credential) { authResult, error in
      if error != nil {
        // Handle error.
      }
      // User is re-authenticated with fresh tokens minted and
      // should be able to perform sensitive operations like account
      // deletion and email or password update.
      // IdP data available in result.additionalUserInfo.profile.
      // Additional OAuth access token can also be retrieved:
      // (authResult.credential as? OAuthCredential)?.accessToken
      // OAuth ID token can also be retrieved:
      // (authResult.credential as? OAuthCredential)?.idToken
    }
    

    Objective-C

    [[FIRAuth auth].currentUser
        reauthenticateWithCredential:credential
                          completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
      if (error) {
        // Handle error.
      }
      // User is re-authenticated with fresh tokens minted and
      // should be able to perform sensitive operations like account
      // deletion and email or password update.
      // IdP data available in result.additionalUserInfo.profile.
      // Additional OAuth access token can also be retrieved:
      // ((FIROAuthCredential *)authResult.credential).accessToken
      // OAuth ID token can also be retrieved:
      // ((FIROAuthCredential *)authResult.credential).idToken
    }];
    

サインインフローを手動で処理する

アプリにOpenIDConnectサインインフローを既に実装している場合は、IDトークンを直接使用してFirebaseで認証できます。

迅速

let credential = OAuthProvider.credential(
    withProviderID: "oidc.example-provider",  // As registered in Firebase console.
    idToken: idToken,  // ID token from OpenID Connect flow.
    rawNonce: nil
)
Auth.auth().signIn(with: credential) { authResult, error in
    if error {
        // Handle error.
        return
    }
    // User is signed in.
    // IdP data available in authResult?.additionalUserInfo?.profile
}

Objective-C

FIROAuthCredential *credential =
    [FIROAuthProvider credentialWithProviderID:@"oidc.example-provider"  // As registered in Firebase console.
                                       IDToken:idToken  // ID token from OpenID Connect flow.
                                      rawNonce:nil];
[[FIRAuth auth] signInWithCredential:credential
                          completion:^(FIRAuthDataResult * _Nullable authResult,
                                      NSError * _Nullable error) {
    if (error != nil) {
        // Handle error.
        return;
    }
    // User is signed in.
    // IdP data available in authResult.additionalUserInfo.profile
}];

次のステップ

ユーザーが初めてサインインすると、新しいユーザーアカウントが作成され、ユーザーがサインインした資格情報(つまり、ユーザー名とパスワード、電話番号、または認証プロバイダー情報)にリンクされます。この新しいアカウントはFirebaseプロジェクトの一部として保存され、ユーザーのログイン方法に関係なく、プロジェクト内のすべてのアプリでユーザーを識別するために使用できます。

  • アプリでは、 FIRUserオブジェクトからユーザーの基本的なプロファイル情報を取得できます。ユーザーの管理を参照してください。

  • FirebaseRealtimeデータベースとCloudStorageのセキュリティルールでは、ログインしたユーザーの一意のユーザーIDをauth変数から取得し、それを使用してユーザーがアクセスできるデータを制御できます。

認証プロバイダーのクレデンシャルを既存のユーザーアカウントにリンクすることで、ユーザーが複数の認証プロバイダーを使用してアプリにサインインできるようにすることができます。

ユーザーをサインアウトするには、 signOut:を呼び出します。

迅速

    let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}
  

Objective-C

    NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

また、認証エラーの全範囲に対応するエラー処理コードを追加することもできます。エラーの処理を参照してください。