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

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

準備

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

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

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

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

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

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

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

    Objective-C

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

    Swift

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

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

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

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

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

Objective-C

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

Swift

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

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