在 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. FIRAuthCredential 对象传递给已登录用户的 linkWithCredential:completion: 方法:

    Swift
        user.linkAndRetrieveData(with: credential) { (authResult, error) in
      // ...
    }
    }
    
    Objective-C
        [[FIRAuth auth].currentUser linkAndRetrieveDataWithCredential:credential
        completion:^(FIRAuthDataResult *result, NSError *_Nullable error) {
      // ...
    }];
    

    如果凭据已与另一用户帐号关联,则无法调用 linkWithCredential:completion:。在这种情况下,您必须根据需要为您的应用合并帐号和相关数据:

    Swift

    let prevUser = Auth.auth().currentUser
    Auth.auth().signInAndRetrieveData(with: credential) { (authResult, 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] signInAndRetrieveDataWithCredential:credential
                                             completion:^(FIRAuthDataResult * _Nullable authResult,
                                                          NSError * _Nullable error) {
      if (error) {
        // ...
        return;
      }
      // User successfully signed in. Get user data from the FIRUser object
      if (authResult == nil) { return; }
      FIRUser *user = authResult.user;
      // ...
    }];
                                        // Merge prevUser and currentUser accounts and data
                                        // ...
                                    }];
    

如果对 linkWithCredential:completion: 的调用成功,用户便可通过关联的任意身份验证提供方服务进行登录,并访问相同的 Firebase 数据。

取消身份验证提供方与用户帐号的关联

您可以取消身份验证提供方与帐号的关联,这样用户就无法再通过该提供方登录了。

要取消身份验证提供方与用户帐号的关联,请将提供方 ID 传递给 unlinkFromProvider:completion: 方法。您可以从 providerData 属性中获取与用户相关联的身份验证提供方的提供方 ID。

Swift

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

Objective-C

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

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面