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

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

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

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

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

Вход с Apple могут настроить только участники программы Apple Developer Program .

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

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

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

  1. В консоли Firebase откройте раздел Auth . На вкладке «Метод входа» включите поставщика Apple .
  2. Настройте параметры поставщика услуг Apple Sign In:
    1. Если вы развертываете свое приложение только на платформах Apple, вы можете оставить поля Service ID, Apple Team ID, секретный ключ и идентификатор ключа пустыми.
    2. Для поддержки на устройствах Android:
      1. Добавьте Firebase в свой проект Android . Обязательно зарегистрируйте подпись SHA-1 вашего приложения при настройке приложения в консоли Firebase .
      2. В консоли Firebase откройте раздел Auth . На вкладке «Метод входа» включите поставщика 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.

Доступ к классу 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 Package . Возможно, вам придется изменить код, чтобы перевести сгенерированную случайную строку nonce в состояние необработанной строки для использования в операциях Firebase (то есть сохранить ее копию до создания формы дайджеста SHA256 nonce).

  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.FirebaseException будет выброшено Firebase.Auth.FirebaseAccountLinkException . В этом случае исключение включает свойство UserInfo.UpdatedCredential , которое, если оно действительно, может использоваться для входа в систему пользователя, связанного с Apple, через FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync . Обновленные учетные данные устраняют необходимость создания нового токена входа Apple с 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 в свое приложение с помощью 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 вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной auth и использовать его для управления тем, к каким данным пользователь может получить доступ.