Połącz wielu dostawców uwierzytelniania z kontem w Unity

Możesz zezwolić użytkownikom na logowanie się do Twojej aplikacji przy użyciu wielu dostawców uwierzytelniania, łącząc poświadczenia dostawcy uwierzytelniania z istniejącym kontem użytkownika. Użytkowników można zidentyfikować za pomocą tego samego identyfikatora użytkownika Firebase, niezależnie od dostawcy uwierzytelniania, którego użyli do zalogowania. Na przykład użytkownik, który zalogował się przy użyciu hasła, może w przyszłości połączyć konto Google i zalogować się dowolną metodą. Lub anonimowy użytkownik może połączyć konto na Facebooku, a następnie zalogować się za pomocą Facebooka, aby dalej korzystać z aplikacji.

Zanim zaczniesz

Dodaj obsługę co najmniej dwóch dostawców uwierzytelniania (możliwe, że w tym uwierzytelnianie anonimowe) do swojej aplikacji.

Klasa FirebaseAuth jest bramą dla wszystkich wywołań interfejsu API. Jest dostępny za pośrednictwem FirebaseAuth.DefaultInstance .
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

Aby połączyć poświadczenia dostawcy uwierzytelniania z istniejącym kontem użytkownika:

  1. Zaloguj się użytkownika przy użyciu dowolnego dostawcy lub metody uwierzytelniania.
  2. Zakończ proces logowania dla nowego dostawcy uwierzytelniania, aż do wywołania jednej z metod Firebase.Auth.FirebaseAuth.SignInWithCredentialAsync , ale nie w tym. Na przykład uzyskaj token identyfikatora Google użytkownika, token dostępu do Facebooka lub adres e-mail i hasło.
  3. Uzyskaj Firebase.Auth.Credential dla nowego dostawcy uwierzytelniania:

    Logowanie do Google
    Firebase.Auth.Credential credential =
        Firebase.Auth.GoogleAuthProvider.GetCredential(googleIdToken, googleAccessToken);
    
    Logowanie do Facebooka
    Firebase.Auth.Credential credential =
        Firebase.Auth.FacebookAuthProvider.GetCredential(accessToken);
    
    E-mail-hasło logowanie
    Firebase.Auth.Credential credential =
        Firebase.Auth.EmailAuthProvider.GetCredential(email, password);
    
  4. Przekaż obiekt Firebase.Auth.Credential do metody LinkWithCredentialAsync zalogowanego użytkownika:

    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);
    });
    

    Wywołanie LinkWithCredentialAsync zakończy się niepowodzeniem, jeśli poświadczenia są już połączone z innym kontem użytkownika. W takiej sytuacji musisz obsłużyć scalanie kont i powiązanych danych odpowiednio do Twojej aplikacji:

    // 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.
    });
    

Jeśli wywołanie LinkWithCredentialAsync powiedzie się, użytkownik może teraz zalogować się przy użyciu dowolnego połączonego dostawcy uwierzytelniania i uzyskać dostęp do tych samych danych Firebase.

Możesz odłączyć dostawcę uwierzytelniania od konta, aby użytkownik nie mógł już logować się u tego dostawcy.

Aby odłączyć dostawcę uwierzytelniania od konta użytkownika, przekaż identyfikator dostawcy do metody UnlinkAsync . Identyfikatory dostawców dostawców uwierzytelniania powiązanych z użytkownikiem można uzyskać, wywołując 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);
});