共有 Apple キーチェーンを使ったアプリ間認証を有効にする

Apple プラットフォームの複数のアプリや拡張機能の間で認証状態を共有するには、Keychain Services を使用して認証状態を共有キーチェーンに保存し、共有キーチェーンを使用するようにアプリを構成します。

これにより、ユーザーは次のことが可能になります。

  • 一度ログインすると、同じアクセス グループに属するすべてのアプリにログインする。
  • 一度ログアウトすると、同じアクセス グループに属するすべてのアプリからログアウトする。

アプリ間で認証状態を共有する

アプリ間で認証状態を共有するには、次の操作を行います。

  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. 少なくとも 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;
    

非共有キーチェーンに切り替える

  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. 同じアクセス グループにアクセスできる他のアプリから、ユーザーにアクセスできるようになりました。