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

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

Подготовка

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

Как присоединиться к программе Apple Developer Program

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

Как настроить вход через аккаунт Apple

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

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

  1. В консоли Firebase выберите Безопасность > Аутентификация.
  2. На вкладке Способ входа включите поставщика для входа через Apple.
  3. Настройте параметры поставщика "Войти с Apple":
    • Apple. Если вы развертываете приложение только на платформах Apple, поля "Идентификатор сервиса", "Идентификатор команды Apple", "Закрытый ключ" и "Идентификатор ключа" можно оставить пустыми.
    • Android. Чтобы поддерживать устройства Android, выполните следующие действия:
      1. Добавьте Firebase в проект для Android.
      2. Укажите цифровой отпечаток SHA-1 приложения, если вы ещё этого не сделали.
        1. В консоли Firebase перейдите на вкладку Настройки > Общие.
        2. Прокрутите страницу вниз до карточки Ваши приложения, выберите приложение Android и добавьте цифровой отпечаток SHA-1 в поле Цифровые отпечатки сертификата SHA.

        О том, как получить цифровой отпечаток SHA приложения, можно прочитать в разделе об аутентификации клиентов.

      3. Настройте параметры поставщика "Войти с Apple":
        1. В консоли Firebase выберите Безопасность > Аутентификация.
        2. На вкладке Способ входа нажмите на поставщика услуг входа Apple.
        3. Укажите идентификатор сервиса, созданный в предыдущем разделе. Кроме того, в разделе конфигурации потока кода OAuth укажите идентификатор команды Apple, закрытый ключ и идентификатор ключа, созданные в предыдущем разделе.

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

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

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

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

Этот список не является исчерпывающим. Чтобы убедиться, что ваше приложение соответствует требованиям Apple, ознакомьтесь с лицензионным соглашением программы для разработчиков Apple в разделе "Членство" вашего аккаунта разработчика.

Как получить доступ к курсу Firebase.Auth.FirebaseAuth

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

Как обрабатывать процесс входа с помощью Firebase SDK

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

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

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

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

    Firebase.Auth.Credential credential =
        Firebase.Auth.OAuthProvider.GetCredential("apple.com", appleIdToken, rawNonce, appleAuthorizationCode);
    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 на платформах Apple может возникнуть ошибка, связанная с тем, что аккаунт Firebase уже связан с аккаунтом Apple. В этом случае вместо стандартного исключения Firebase.FirebaseException будет сгенерировано исключение Firebase.Auth.FirebaseAccountLinkException. В этом случае исключение содержит свойство UserInfo.UpdatedCredential, которое, если оно действительно, можно использовать для входа пользователя, связанного с Apple, через FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync. Обновленные учетные данные позволяют не создавать новый токен для входа через Apple с однократно используемым номером.

    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 с помощью объекта поставщика аутентификации. Обратите внимание, что в отличие от других операций 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

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

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

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

Дальнейшие действия

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

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

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