使用共享 Apple 密钥链启用跨应用身份验证

如需在 Apple 平台上跨多个应用或扩展程序共享身份验证状态,请使用密钥链服务将身份验证状态存储在共享密钥链中,并将这些应用配置为使用该共享密钥链。

这可实现以下目的:

  • 用户执行一次登录操作,即可登录同一访问群组中的所有应用。
  • 用户执行一次退出登录操作,即可退出登录属于同一访问群组的所有应用。

在应用之间共享身份验证状态

如需在应用之间共享身份验证状态,请执行以下操作:

  1. 为您的应用设置访问群组。

    您可以使用密钥链访问群组或应用群组。如需了解详情,请参阅在一系列应用中共享对密钥链项的访问权限

    如需设置密钥链访问群组,请为每个应用执行以下操作:

    1. 在 Xcode 中,转到 Project settings > Capabilities
    2. 启用密钥链共享。
    3. 添加密钥链群组标识符。为需要共享状态的所有应用使用同一标识符。
  2. 在每个应用中,将访问群组设置为您在上一步中创建的密钥链访问群组或应用群组。

    Swift

    do {
      try Auth.auth().useUserAccessGroup("TEAMID.com.example.group1")
    } catch let error as NSError {
      print("Error changing user access group: %@", error)
    }
    

    Objective-C

    [FIRAuth.auth useUserAccessGroup:@"TEAMID.com.example.group1"
                                       error:nil];
    
  3. 在至少一个应用中,使用任意登录方法让用户登录。

    Swift

    Auth.auth().signInAnonymously { result, error in
      // User signed in
    }
    

    Objective-C

    [FIRAuth signInAnonymouslyWithCompletion:^(FIRAuthDataResult *_Nullable result,
                                               NSError *_Nullable error) {
      // User signed in
    }];
    

    同一当前用户可在该访问群组的所有应用中调用。

    Swift

    var user = Auth.auth().currentUser
    

    Objective-C

    FIRUser *user = FIRAuth.auth.currentUser;
    

切换回未共享的密钥链

  1. 将访问群组设置为 nil,以停止共享身份验证状态。

    Swift

    do {
      try Auth.auth().useUserAccessGroup(nil)
    } catch let error as NSError {
      print("Error changing user access group: %@", error)
    }
    

    Objective-C

    [FIRAuth.auth useUserAccessGroup:nil error:nil];
    
  2. 使用任意登录方法让用户登录。任何其他应用将无法获知用户状态。

    Swift

    Auth.auth().signInAnonymously { result, error in
      // User signed in
    }
    

    Objective-C

    [FIRAuth signInAnonymouslyWithCompletion:^(FIRAuthDataResult *_Nullable result,
                                       NSError *_Nullable error) {
      // User signed in
    }];
    

将已登录的用户迁移到共享密钥链

如需将已登录的用户迁移到共享状态,请执行以下操作:

  1. 生成对当前用户的引用以供将来使用。

    Swift

    var user = Auth.auth().currentUser
    

    Objective-C

    FIRUser *user = FIRAuth.auth.currentUser;
    
  2. (可选)检查要共享的访问群组的身份验证状态。

    Swift

    let accessGroup = "TEAMID.com.example.group1"
    var tempUser: User?
    do {
      try tempUser = Auth.auth().getStoredUser(forAccessGroup: accessGroup)
    } catch let error as NSError {
      print("Error getting stored user: %@", error)
    }
    if tempUser != nil {
      // A user exists in the access group
    } else {
      // No user exists in the access group
    }
    

    Objective-C

    NSString *accessGroup = @"TEAMID.com.example.group1";
    FIRUser *tempUser = [FIRAuth getStoredUserForAccessGroup:accessGroup
                                                       error:nil];
    if (tempUser) {
      // A user exists in the access group
      } else {
      // No user exists in the access group
    }
    
  3. 使用您之前在项目设置中设置的访问群组。

    Swift

    do {
      try Auth.auth().useUserAccessGroup(accessGroup)
    } catch let error as NSError {
      print("Error changing user access group: %@", error)
    }
    

    Objective-C

    [FIRAuth.auth useUserAccessGroup:accessGroup error:nil];
    
  4. 更新当前用户。

    Swift

    Auth.auth().updateCurrentUser(user!) { error in
      // Error handling
    }
    

    Objective-C

    [FIRAuth.auth updateCurrentUser:user completion:^(NSError * _Nullable error) {
      // Error handling
    }];
    
  5. 现在,有权访问同一访问群组的其他应用可以访问该用户了。