使用共享 Keychain 启用跨应用身份验证
如需在 Apple 平台上跨多个应用或扩展程序共享身份验证状态,请使用密钥链服务将身份验证状态存储在共享密钥链中,并将这些应用配置为使用该共享密钥链。
这可实现以下目的:
- 用户执行一次登录操作,即可登录同一访问群组中的所有应用。
- 用户执行一次退出登录操作,即可退出登录属于同一访问群组的所有应用。
在应用之间共享身份验证状态
如需在应用之间共享身份验证状态,请执行以下操作:
- 为您的应用设置访问群组。
您可以使用密钥链访问群组或应用群组。如需了解详情,请参阅在一系列应用中共享对密钥链项的访问权限。
如需设置密钥链访问群组,请为每个应用执行以下操作:
- 在 Xcode 中,前往项目设置 > 功能。
- 启用密钥链共享。
- 添加密钥链群组标识符。为需要共享状态的所有应用使用同一标识符。
- 在每个应用中,将访问群组设置为您在上一步中创建的密钥链访问群组或应用群组。
### 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;
切换回未共享的密钥链
- 将访问群组设置为
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
}];
将已登录的用户迁移到共享密钥链
如需将已登录的用户迁移到共享状态,请执行以下操作:
- 生成对当前用户的引用以供将来使用。
### 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. 现在,有权访问同一访问群组的其他应用可以访问该用户了。
