iOS でアカウントに複数の認証プロバイダをリンクする

既存のユーザー アカウントに認証プロバイダの認証情報をリンクすることで、ユーザーが複数の認証プロバイダを使用してアプリにログインできるようになります。ログインに使用した認証プロバイダに関係なく、同じ Firebase ユーザー ID でユーザーを識別できます。たとえば、パスワードを使用してログインしたユーザーが認証情報を Google アカウントにリンクすれば、それ以降はどちらの方法でもログインできるようになります。また、匿名ユーザーが認証情報を Facebook アカウントにリンクすると、それ以降は Facebook にログインしてアプリを使用できるようになります。

準備

アプリに複数の認証プロバイダ(匿名認証も含む)のサポートを追加します。

ユーザー アカウントに認証プロバイダの認証情報をリンクする

既存のユーザー アカウントに認証プロバイダの認証情報をリンクするには:

  1. 任意の認証プロバイダや認証方法を使用してユーザーのログインを行います。
  2. 新しい認証プロバイダのログインフローを行います(ただし、いずれかの FIRAuth.signInWith メソッドを呼び出す手前まで)。たとえば、ユーザーの Google ID トークン、Facebook アクセス トークン、またはメールとパスワードを取得します。
  3. 新しい認証プロバイダの FIRAuthCredential を取得します。

    Google ログイン
    Objective-C
    GIDAuthentication *authentication = user.authentication;
    FIRAuthCredential *credential =
    [FIRGoogleAuthProvider credentialWithIDToken:authentication.idToken
                                     accessToken:authentication.accessToken];
    
    Swift
    guard let authentication = user.authentication else { return }
    let credential = FIRGoogleAuthProvider.credential(withIDToken: authentication.idToken,
        accessToken: authentication.accessToken)
    
    Facebook ログイン
    Objective-C
    FIRAuthCredential *credential = [FIRFacebookAuthProvider
                                     credentialWithAccessToken:[FBSDKAccessToken currentAccessToken]
                                     .tokenString];
    
    Swift
    let credential = FIRFacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.current().tokenString)
    
    メールとパスワードによるログイン
    Objective-C
    FIRAuthCredential *credential =
        [FIREmailPasswordAuthProvider credentialWithEmail:email
                                                 password:password];
    
    Swift
    let credential = FIREmailPasswordAuthProvider.credential(withEmail: email, password: password)
    
  4. ログインしたユーザーの linkWithCredential:completion: メソッドに FIRAuthCredential オブジェクトを渡します。

    Objective-C
        [[FIRAuth auth]
     .currentUser linkWithCredential:credential
     completion:^(FIRUser *_Nullable user, NSError *_Nullable error) {
       // ...
     }];
    
    Swift
        user.link(with: credential) { (user, error) in
      // ...
    }
    }
    

    認証情報が別のユーザー アカウントに既にリンクされている場合は、linkWithCredential:completion: の呼び出しが失敗します。この場合は、アプリに適した方法でアカウントと関連データの統合を行う必要があります。

    Objective-C

    FIRUser *prevUser = [FIRAuth auth].currentUser;
    [[FIRAuth auth] signInWithCredential:credential
                              completion:^(FIRUser *user, NSError *error) {
                                // ...
                                  if (error) {
                                    // ...
                                    return;
                                  }
                                        // Merge prevUser and currentUser accounts and data
                                        // ...
                                    }];
    

    Swift

    let prevUser = FIRAuth.auth()?.currentUser
    FIRAuth.auth()?.signIn(with: credential) { (user, error) in
      // ...
        if let error = error {
          // ...
          return
        }
                // Merge prevUser and currentUser accounts and data
                // ...
            }
    

linkWithCredential:completion: の呼び出しが成功したら、ユーザーはリンクされた認証プロバイダを使用してログインし、同じ Firebase データにアクセスできるようになります。

ユーザー アカウントから認証プロバイダのリンクを解除する

アカウントから認証プロバイダのリンクを解除することで、ユーザーがそのプロバイダを使用してログインできなくなるようにすることができます。

ユーザー アカウントから認証プロバイダのリンクを解除するには、プロバイダ ID を unlinkFromProvider:completion: メソッドに渡します。ユーザーにリンクされている認証プロバイダのプロバイダ ID は providerData プロパティから取得できます。

Objective-C

[[FIRAuth auth]
        .currentUser unlinkFromProvider:providerID
                             completion:^(FIRUser *_Nullable user, NSError *_Nullable error) {
                               // ...
                             }];

Swift

FIRAuth.auth()?.currentUser?.unlink(fromProvider: providerID!) { (user, error) in
  // ...
}

フィードバックを送信...