Включение аутентификации между приложениями с помощью общей связки ключей Apple.

Чтобы совместно использовать состояние аутентификации несколькими приложениями или расширениями на платформах Apple, сохраните состояние аутентификации в общей связке ключей с помощью службы Keychain Services и настройте свои приложения для использования этой общей связки ключей.

Это позволяет пользователям:

  • Войдите в систему один раз, и вы будете авторизованы во всех приложениях, входящих в одну и ту же группу доступа.
  • Выйдите из системы один раз, и ваш логин будет активен во всех приложениях, входящих в ту же группу доступа.

Обмен состоянием аутентификации между приложениями

Для обмена данными об аутентификации между приложениями:

  1. Создайте группу доступа для ваших приложений.

    Вы можете использовать либо группу доступа к связке ключей, либо группу приложений. Подробности см. в разделе «Предоставление доступа к элементам связки ключей группе приложений» .

    Чтобы настроить группу доступа к связке ключей, выполните следующие действия для каждого приложения:

    1. В Xcode перейдите в «Настройки проекта» > «Возможности» .
    2. Включить общий доступ к связке ключей.
    3. Добавьте идентификатор группы в связке ключей. Используйте один и тот же идентификатор для всех приложений, состояние которых вы хотите совместно использовать.
  2. В каждом приложении установите группу доступа, используя группу доступа связки ключей или группу приложений, созданную на предыдущем шаге.

    Быстрый

    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. По крайней мере в одном приложении можно авторизовать пользователя любым способом.

    Быстрый

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

    Objective-C

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

    Один и тот же текущий пользователь доступен во всех приложениях в группе доступа.

    Быстрый

    var user = Auth.auth().currentUser
    

    Objective-C

    FIRUser *user = FIRAuth.auth.currentUser;
    

Вернитесь к использованию необщего брелока.

  1. Чтобы прекратить совместное использование состояния аутентификации, установите для группы доступа значение nil .

    Быстрый

    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. Войдите в систему любым способом. Состояние пользователя не будет доступно другим приложениям.

    Быстрый

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

    Objective-C

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

Перенесите авторизованного пользователя в общую связку ключей.

Чтобы перевести пользователя, который уже вошел в систему, в общее состояние:

  1. Создайте ссылку на текущего пользователя для дальнейшего использования.

    Быстрый

    var user = Auth.auth().currentUser
    

    Objective-C

    FIRUser *user = FIRAuth.auth.currentUser;
    
  2. (Необязательно) Проверьте состояние аутентификации группы доступа, которой вы хотите предоставить доступ.

    Быстрый

    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. Используйте группу доступа, которую вы ранее задали в настройках проекта.

    Быстрый

    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. Обновите данные текущего пользователя.

    Быстрый

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

    Objective-C

    [FIRAuth.auth updateCurrentUser:user completion:^(NSError * _Nullable error) {
      // Error handling
    }];
    
  5. Теперь к пользователю могут получить доступ другие приложения, имеющие доступ к той же группе доступа.