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

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

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

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

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

Настроить функцию «Вход с помощью Apple» могут только участники программы Apple Developer Program .

Настройка входа в систему с помощью Apple

В вашем проекте Firebase необходимо включить и правильно настроить вход через Apple. Настройки Apple для разработчиков различаются в зависимости от платформы Android и Apple. Перед продолжением ознакомьтесь с разделом «Настройка входа через Apple» в руководствах для 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» предоставляет пользователям возможность анонимизировать свои данные, включая адрес электронной почты, при входе в систему. Пользователи, выбравшие этот вариант, имеют адреса электронной почты с доменом privaterelay.appleid.com . При использовании функции «Вход с Apple» в вашем приложении необходимо соблюдать все применимые правила и условия Apple для разработчиков, касающиеся этих анонимизированных Apple ID.

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

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

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

Получите доступ к классу Firebase.Auth.FirebaseAuth

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

Обрабатывайте процесс авторизации с помощью Firebase SDK.

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

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

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

  2. Используйте полученную строку токена и необработанный nonce для создания учетных данных 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 с одноразовым кодом (nonce) для операции входа.

    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 с использованием SDK Firebase для обеспечения сквозного процесса авторизации.

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