Apple プラットフォームの複数のアプリや拡張機能の間で認証状態を共有するには、Keychain Services を使用して認証状態を共有キーチェーンに保存し、共有キーチェーンを使用するようにアプリを構成します。
これにより、ユーザーは次のことが可能になります。
- 一度ログインすると、同じアクセス グループに属するすべてのアプリにログインする。
- 一度ログアウトすると、同じアクセス グループに属するすべてのアプリからログアウトする。
アプリ間で認証状態を共有する
アプリ間で認証状態を共有するには、次の操作を行います。
アプリ用のアクセス グループを設定します。
キーチェーン アクセス グループまたはアプリグループを使用できます。詳細については、アプリのコレクション間でキーチェーン アイテムへのアクセスを共有するをご覧ください。
キーチェーン アクセス グループを設定するには、アプリごとに次の手順を行います。
- Xcode で、[Project settings] > [Capabilities] に移動します。
- キーチェーン共有を有効にします。
- キーチェーン グループ識別子を追加します。状態を共有するすべてのアプリについて同じ識別子を使用します。
各アプリで、アクセス グループを、前の手順で作成したキーチェーン アクセス グループまたはアプリグループに設定します。
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];
少なくとも 1 つのアプリで、任意のログイン方法でユーザーのログインを行います。
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];
任意のログイン方法でユーザーのログインを行います。ユーザーの状態は、他のアプリでは利用できません。
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;
(省略可)共有するアクセス グループの認証状態を確認します。
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 }
プロジェクト設定で以前設定したアクセス グループを使用します。
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];
現在のユーザーを更新します。
Swift
Auth.auth().updateCurrentUser(user!) { error in // Error handling }
Objective-C
[FIRAuth.auth updateCurrentUser:user completion:^(NSError * _Nullable error) { // Error handling }];
同じアクセス グループにアクセスできる他のアプリから、ユーザーにアクセスできるようになりました。