공유된 Apple 키체인으로 앱 간 인증 사용 설정

Apple 플랫폼의 여러 앱이나 확장 프로그램에서 인증 상태를 공유하려면 Keychain Services를 사용하여 공유 키체인에 인증 상태를 저장하고 이 공유 키체인을 사용하도록 앱을 구성합니다.

이렇게 인증 상태를 공유하면 다음과 같은 로그인/로그아웃 동작이 가능합니다.

  • 한 번 로그인하면 동일한 액세스 그룹에 속한 모든 앱에 로그인됩니다.
  • 한 번 로그아웃하면 동일한 액세스 그룹에 속한 모든 앱에서 로그아웃됩니다.

앱 간에 인증 상태 공유

앱 간에 인증 상태를 공유하려면 다음 안내를 따르세요.

  1. 앱에 대한 액세스 그룹을 설정합니다.

    키체인 액세스 그룹 또는 앱 그룹을 사용할 수 있습니다. 자세한 내용은 Sharing Access to Keychain Items Among a Collection of Apps(앱 모음에서 키체인 항목에 대한 액세스 권한 공유)를 참조하세요.

    키체인 액세스 그룹을 설정하려면 각 앱마다 다음 안내를 따르세요.

    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. 동일한 액세스 그룹에 액세스할 수 있는 다른 앱에서 이제 사용자에 액세스할 수 있습니다.