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

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

準備

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

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

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

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

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

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

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

    Swift

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

    Objective-C

    FIRUser *prevUser = [FIRAuth auth].currentUser;
    [[FIRAuth auth] signInWithCredential:credential
                              completion:^(FIRUser *user, NSError *error) {
      if (error) {
        // ...
        return;
      }
      // User successfully signed in. Get user data from the FIRUser object
      // ...
    }];
                                        // Merge prevUser and currentUser accounts and data
                                        // ...
                                    }];
    

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

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

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

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

Swift

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

Objective-C

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

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

ご不明な点がありましたら、Google のサポートページをご覧ください。