Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

Связать несколько поставщиков аутентификации с учетной записью в Unity

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

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

Прежде чем вы начнете

Добавьте в свое приложение поддержку двух или более поставщиков аутентификации (возможно, включая анонимную аутентификацию).

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

Чтобы связать учетные данные поставщика аутентификации с существующей учетной записью пользователя:

  1. Войдите в систему с помощью любого поставщика или метода проверки подлинности.
  2. Завершите процесс входа для нового поставщика проверки подлинности вплоть до вызова одного из методов Firebase.Auth.FirebaseAuth.SignInWithCredentialAsync , но не включая его. Например, получите токен Google ID пользователя, токен доступа Facebook или адрес электронной почты и пароль.
  3. Получите Firebase.Auth.Credential для нового поставщика аутентификации:

    Вход в Google
    Firebase.Auth.Credential credential =
        Firebase.Auth.GoogleAuthProvider.GetCredential(googleIdToken, googleAccessToken);
    
    Вход в Facebook
    Firebase.Auth.Credential credential =
        Firebase.Auth.FacebookAuthProvider.GetCredential(accessToken);
    
    -placeholder3 Вход с паролем по электронной почте
    Firebase.Auth.Credential credential =
        Firebase.Auth.EmailAuthProvider.GetCredential(email, password);
    
  4. Передайте объект Firebase.Auth.Credential методу LinkWithCredentialAsync пользователя:

    auth.CurrentUser.LinkWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("LinkWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("LinkWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.FirebaseUser newUser = task.Result;
      Debug.LogFormat("Credentials successfully linked to Firebase user: {0} ({1})",
          newUser.DisplayName, newUser.UserId);
    });
    

    Вызов LinkWithCredentialAsync завершится ошибкой, если учетные данные уже связаны с другой учетной записью пользователя. В этой ситуации вы должны обработать объединение учетных записей и связанных данных в соответствии с вашим приложением:

    // Gather data for the currently signed in User.
    string currentUserId = auth.CurrentUser.UserId;
    string currentEmail = auth.CurrentUser.Email;
    string currentDisplayName = auth.CurrentUser.DisplayName;
    System.Uri currentPhotoUrl = auth.CurrentUser.PhotoUrl;
    
    // Sign in with the new credentials.
    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);
    
      // TODO: Merge app specific details using the newUser and values from the
      // previous user, saved above.
    });
    

Если вызов LinkWithCredentialAsync успешен, теперь пользователь может войти в систему, используя любого связанного поставщика проверки подлинности, и получить доступ к тем же данным Firebase.

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

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

// Unlink the sign-in provider from the currently active user.
// providerIdString is a string identifying a provider,
// retrieved via FirebaseAuth.FetchProvidersForEmail().
auth.CurrentUser.UnlinkAsync(providerIdString).ContinueWith(task => {
  if (task.IsCanceled) {
    Debug.LogError("UnlinkAsync was canceled.");
    return;
  }
  if (task.IsFaulted) {
    Debug.LogError("UnlinkAsync encountered an error: " + task.Exception);
    return;
  }

  // The user has been unlinked from the provider.
  Firebase.Auth.FirebaseUser newUser = task.Result;
  Debug.LogFormat("Credentials successfully unlinked from user: {0} ({1})",
      newUser.DisplayName, newUser.UserId);
});