Аутентификация с помощью Apple и Unity

Вы можете разрешить своим пользователям проходить аутентификацию в Firebase с использованием их Apple ID, используя Firebase SDK для реализации сквозного процесса входа OAuth 2.0.

Прежде чем начать

Чтобы выполнить вход пользователей с помощью Apple, сначала настройте функцию «Вход с Apple» на сайте разработчиков Apple, а затем включите Apple в качестве поставщика входа для вашего проекта Firebase.

Присоединяйтесь к программе разработчиков Apple

Функцию «Войти с Apple» могут настроить только участники программы разработчиков Apple .

Настроить вход с Apple

Вход через Apple должен быть включен и правильно настроен в вашем проекте Firebase. Настройки Apple Developer различаются на платформах Android и Apple. Перед продолжением работы ознакомьтесь с разделом «Настройка входа через Apple» в руководствах для iOS+ и/или Android .

Включить Apple в качестве поставщика услуг входа

  1. В консоли Firebase откройте раздел «Аутентификация» . На вкладке «Метод входа» включите поставщика Apple .
  2. Настройте параметры поставщика входа Apple:
    1. Если вы развертываете свое приложение только на платформах Apple, вы можете оставить поля «Идентификатор сервиса», «Идентификатор команды Apple», «Закрытый ключ» и «Идентификатор ключа» пустыми.
    2. Для поддержки устройств Android:
      1. Добавьте Firebase в свой проект Android . Обязательно зарегистрируйте подпись SHA-1 вашего приложения при настройке в консоли Firebase .
      2. В консоли Firebase откройте раздел «Аутентификация» . На вкладке «Метод входа» включите поставщика Apple . Укажите идентификатор сервиса, созданный в предыдущем разделе. Кроме того, в разделе конфигурации потока кода OAuth укажите идентификатор Apple Team ID, а также закрытый ключ и идентификатор ключа, созданные в предыдущем разделе.

Соблюдайте требования Apple к анонимным данным

Функция «Войти с Apple» предоставляет пользователям возможность анонимизировать свои данные, включая адрес электронной почты, при входе в систему. Адреса электронной почты пользователей, выбравших эту опцию, находятся в домене privaterelay.appleid.com . При использовании функции «Войти с Apple» в вашем приложении вы должны соблюдать все применимые политики разработчиков или условия Apple в отношении этих анонимизированных идентификаторов Apple ID.

Это включает получение любого необходимого согласия пользователя перед связыванием какой-либо персональной информации, позволяющей идентифицировать пользователя, с анонимизированным Apple ID. При использовании аутентификации Firebase это может включать следующие действия:

  • Свяжите адрес электронной почты с анонимным Apple ID и наоборот.
  • Привязать номер телефона к анонимному Apple ID и наоборот
  • Свяжите неанонимные учетные данные социальной сети (Facebook, Google и т. д.) с анонимным Apple ID или наоборот.

Приведённый выше список не является исчерпывающим. Чтобы убедиться, что ваше приложение соответствует требованиям Apple, ознакомьтесь с лицензионным соглашением программы Apple Developer Program в разделе «Участие» вашей учётной записи разработчика.

Доступ к классу Firebase.Auth.FirebaseAuth

Класс FirebaseAuth служит шлюзом для всех вызовов API. Он доступен через FirebaseAuth.DefaultInstance .
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

Управляйте процессом входа с помощью Firebase SDK

Процесс входа в систему с помощью Apple различается на разных платформах Apple и Android.

На платформах Apple

  1. Установите сторонний плагин для обработки одноразовых значений и генерации токенов входа Apple, например , пакет Unity Sign In With Apple Asset Storage . Возможно, вам потребуется изменить код, чтобы перенести сгенерированную случайную строку одноразовых значений в исходное состояние для использования в операциях Firebase (то есть сохранить её копию до создания дайджеста SHA256 для одноразовых значений).

  2. Используйте полученную строку токена и необработанный одноразовый код для создания учетных данных Firebase и входа в Firebase.

    Firebase.Auth.Credential credential =
        Firebase.Auth.OAuthProvider.GetCredential("apple.com", appleIdToken, rawNonce, null);
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.AuthResult result = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          result.User.DisplayName, result.User.UserId);
    });

  3. Тот же шаблон можно использовать с ReauthenticateAsync , который можно использовать для получения новых учётных данных для конфиденциальных операций, требующих недавнего входа в систему. Подробнее см. в разделе «Управление пользователями» .

  4. При подключении с помощью Apple Sign In на платформах Apple может возникнуть ошибка, сообщающая о том, что существующая учётная запись Firebase уже связана с учётной записью Apple. В этом случае вместо стандартного исключения Firebase.Auth.FirebaseAccountLinkException будет сгенерировано исключение Firebase.FirebaseException . В этом случае исключение включает свойство UserInfo.UpdatedCredential , которое, если оно действительно, может быть использовано для входа связанного пользователя Apple через FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync . Обновлённые учётные данные позволяют избежать необходимости генерировать новый токен Apple Sign-In с одноразовым значением для операции входа.

    auth.CurrentUser.LinkWithCredentialAsync(
      Firebase.Auth.OAuthProvider.GetCredential("apple.com", idToken, rawNonce, null))
        .ContinueWithOnMainThread( task => {
          if (task.IsCompletedSuccessfully) {
            // Link Success
          } else {
            if (task.Exception != null) {
              foreach (Exception exception in task.Exception.Flatten().InnerExceptions) {
                Firebase.Auth.FirebaseAccountLinkException firebaseEx =
                  exception as Firebase.Auth.FirebaseAccountLinkException;
                if (firebaseEx != null && firebaseEx.UserInfo.UpdatedCredential.IsValid()) {
                  // Attempt to sign in with the updated credential.
                  auth.SignInAndRetrieveDataWithCredentialAsync(firebaseEx.UserInfo.UpdatedCredential).
                    ContinueWithOnMainThread( authResultTask => {
                      // Handle Auth result.
                    });
                } else {
                  Debug.Log("Link with Apple failed:" + firebaseEx );
                }
              } // end for loop
            }
          }
        });

На Android

На устройствах Android аутентифицируйте своих пользователей с помощью Firebase, интегрировав в свое приложение универсальный веб-вход OAuth с помощью Firebase SDK для реализации сквозного процесса входа.

Чтобы организовать процесс входа с помощью Firebase SDK, выполните следующие действия:

  1. Создайте экземпляр FederatedOAuthProviderData , настроенный с идентификатором провайдера, подходящим для Apple.

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    
    providerData.ProviderId = "apple.com";
    
  2. Необязательно: укажите дополнительные области OAuth 2.0, выходящие за рамки областей по умолчанию, которые вы хотите запросить у поставщика аутентификации.

    providerData.Scopes = new List<string>();
    providerData.Scopes.Add("email");
    providerData.Scopes.Add("name");
    
  3. Необязательно: если вы хотите, чтобы экран входа Apple отображался на языке, отличном от английского, задайте соответствующий locale стандарт. Поддерживаемые языковые стандарты см. в документации по входу с Apple .

    providerData.CustomParameters = new Dictionary<string,string>;
    
    // Localize to French.
    providerData.CustomParameters.Add("language", "fr");
    
  4. После настройки данных вашего провайдера используйте их для создания FederatedOAuthProvider.

    // Construct a FederatedOAuthProvider for use in Auth methods.
    Firebase.Auth.FederatedOAuthProvider provider =
      new Firebase.Auth.FederatedOAuthProvider();
    provider.SetProviderData(providerData);
    
  5. Выполните аутентификацию в Firebase с помощью объекта провайдера Auth. Обратите внимание, что в отличие от других операций FirebaseAuth, эта операция перехватит управление вашим пользовательским интерфейсом, открыв всплывающее веб-представление, в котором пользователь может ввести свои учётные данные.

    Чтобы начать процесс входа, вызовите signInWithProvider :

    auth.SignInWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("SignInWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError("SignInWithProviderAsync encountered an error: " +
              task.Exception);
            return;
        }
    
        Firebase.Auth.AuthResult authResult = task.Result;
        Firebase.Auth.FirebaseUser user = authResult.User;
        Debug.LogFormat("User signed in successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  6. Тот же шаблон можно использовать с ReauthenticateWithProvider , который можно использовать для получения новых учетных данных для конфиденциальных операций, требующих недавнего входа в систему.

    user.ReauthenticateWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("ReauthenticateWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError(
            "ReauthenticateWithProviderAsync encountered an error: " +
                task.Exception);
            return;
        }
    
        Firebase.Auth.AuthResult authResult = task.Result;
        Firebase.Auth.FirebaseUser user = authResult.User;
        Debug.LogFormat("User reauthenticated successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  7. Кроме того, вы можете использовать LinkWithCredentialAsync() для привязки различных поставщиков удостоверений к существующим учетным записям.

    Обратите внимание, что Apple требует от вас получить явное согласие пользователей, прежде чем связывать их учетные записи Apple с другими данными.

    Например, чтобы связать учетную запись Facebook с текущей учетной записью Firebase, используйте токен доступа, полученный при входе пользователя в Facebook:

    // Initialize a Facebook credential with a Facebook access token.
    
    Firebase.Auth.Credential credential =
        Firebase.Auth.FacebookAuthProvider.GetCredential(facebook_token);
    
    // Assuming the current user is an Apple user linking a Facebook provider.
    user.LinkWithCredentialAsync(credential)
        .ContinueWithOnMainThread( task => {
          if (task.IsCanceled) {
              Debug.LogError("LinkWithCredentialAsync was canceled.");
              return;
          }
          if (task.IsFaulted) {
            Debug.LogError("LinkWithCredentialAsync encountered an error: "
                           + task.Exception);
              return;
          }
    
          Firebase.Auth.AuthResult result = task.Result;
          Firebase.Auth.FirebaseUser user = result.User;
          Debug.LogFormat("User linked successfully: {0} ({1})",
              user.DisplayName, user.UserId);
        });
    

Войти с помощью Apple Notes

В отличие от других поставщиков, поддерживаемых Firebase Auth, Apple не предоставляет URL-адрес фотографии.

Кроме того, когда пользователь решает не предоставлять приложению свой адрес электронной почты, Apple предоставляет ему уникальный адрес электронной почты (вида xyz@privaterelay.appleid.com ), который затем предоставляется вашему приложению. Если вы настроили службу ретрансляции приватной электронной почты, Apple пересылает письма, отправленные на анонимный адрес, на реальный адрес электронной почты пользователя.

Apple передает приложениям информацию о пользователе, такую ​​как отображаемое имя, только при первом входе пользователя в систему. Обычно Firebase сохраняет отображаемое имя при первом входе пользователя в Apple. Его можно получить с помощью auth.CurrentUser.DisplayName . Однако, если вы ранее использовали Apple для входа пользователя в приложение без использования Firebase, Apple не предоставит Firebase отображаемое имя пользователя.

Следующие шаги

После первого входа пользователя в систему создаётся новая учётная запись, которая привязывается к учётным данным, использованным при входе (имя пользователя и пароль, номер телефона или информация о поставщике аутентификации). Эта новая учётная запись хранится в вашем проекте Firebase и может использоваться для идентификации пользователя в каждом приложении проекта, независимо от способа входа.

В своих приложениях вы можете получить основную информацию о профиле пользователя из объекта Firebase.Auth.FirebaseUser. См. раздел Управление пользователями .

В правилах безопасности Firebase Realtime Database и Cloud Storage вы можете получить уникальный идентификатор вошедшего в систему пользователя из переменной auth и использовать его для управления данными, к которым пользователь может получить доступ.