Catch up on everthing we announced at this year's Firebase Summit. Learn more

Аутентификация с помощью 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, private key и key 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 Developer в разделе «Членство» вашей учетной записи разработчика, чтобы убедиться, что ваше приложение соответствует требованиям 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 в В с Apple Asset Storage Package . Возможно, вам потребуется изменить код, чтобы привязать сгенерированную случайную строку одноразового номера к состоянию необработанной строки для использования в операциях Firebase (то есть сохранить ее копию до создания дайджеста формы SHA256 одноразового номера).

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

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

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

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

    Обратите внимание , что LinkWithCredentialAsync будет продолжать бросать стандартные Firebase.FirebaseException на неудачах линии связи, и , следовательно , не в состоянии возвращать обновленное удостоверение.

    auth.CurrentUser.LinkAndRetrieveDataWithCredentialAsync(
      Firebase.Auth.OAuthProvider.GetCredential("apple.com", idToken, rawNonce, null))
        .ContinueWithOnMainThread( task => {
          if (task.IsCompleted) {
            // 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.SignInWithCredentialAsync(firebaseEx.UserInfo.UpdatedCredential).
                    ContinueWithOnMainThread( signInTask => {
                      // Handle Sign in result.
                    });
                } else {
                  DebugLog("Link with Apple failed:" + firebaseEx );
                }
              } // end for loop
            }
          }
        });
    

На Android

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

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

  1. Построить экземпляр FederatedOAuthProviderData , сконфигурированный с поставщиком ID подходящим для 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.SignInResult signInResult = task.Result;
        Firebase.Auth.FirebaseUser user = signInResult.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.SignInResult signInResult = task.Result;
        Firebase.Auth.FirebaseUser user = signInResult.User;
        Debug.LogFormat("User reauthenticated successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  7. И, вы можете использовать linkWithCredential() , чтобы связать различные провайдер удостоверений для существующих учетных записей.

    Обратите внимание, что 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.LinkAndRetrieveDataWithCredentialAsync(credential)
        .ContinueWithOnMainThread( task => {
          if (task.IsCanceled) {
              Debug.LogError("LinkAndRetrieveDataWithCredentialAsync was canceled.");
              return;
          }
          if (task.IsFaulted) {
            Debug.LogError("LinkAndRetrieveDataWithCredentialAsync encountered an error: "
                           + task.Exception);
              return;
          }
    
          Firebase.Auth.SignInResult signInResult = task.Result;
          Firebase.Auth.FirebaseUser user = signInResult.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, который вы можете получить с getCurrentUser().getDisplayName() . Однако, если вы ранее использовали Apple для входа пользователя в приложение без использования Firebase, Apple не предоставит Firebase отображаемое имя пользователя.

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

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

В своих приложениях вы можете получить основную информацию профиля пользователя из объекта firebase :: auth :: user. См Управление пользователей .

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