Połącz wielu dostawców uwierzytelniania z kontem za pomocą języka C++

Możesz zezwolić użytkownikom na logowanie się w aplikacji za pomocą wielu dostawców uwierzytelniania, łącząc dane logowania dostawcy uwierzytelniania z istniejącym kontem użytkownika. Użytkownicy są identyfikowani za pomocą tego samego identyfikatora użytkownika Firebase niezależnie od dostawcy uwierzytelniania, którego użyli do zalogowania się. Użytkownik, który zalogował się za pomocą hasła, może na przykład połączyć konto Google i w przyszłości logować się za pomocą dowolnej z tych metod. Użytkownik anonimowy może też połączyć konto na Facebooku, a potem zalogować się za pomocą Facebooka, aby nadal korzystać z Twojej aplikacji.

Zanim zaczniesz

Dodaj do aplikacji obsługę co najmniej 2 dostawców uwierzytelniania (może to być uwierzytelnianie anonimowe).

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

  1. Zaloguj użytkownika za pomocą dowolnego dostawcy lub metody uwierzytelniania.
  2. Dokończ proces logowania u nowego dostawcy uwierzytelniania, ale nie wywołuj żadnej z metod firebase::auth::Auth::SignInWithCredential. Możesz na przykład uzyskać 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 przez Google
    firebase::auth::Credential credential =
        firebase::auth::GoogleAuthProvider::GetCredential(google_id_token,
                                                          nullptr);
    Logowanie przez Facebooka
    firebase::auth::Credential credential =
        firebase::auth::FacebookAuthProvider::GetCredential(access_token);
    Logowanie za pomocą adresu e-mail i hasła
    firebase::auth::Credential credential =
        firebase::auth::EmailAuthProvider::GetCredential(email, password);
  4. Przekaż obiekt firebase::auth::Credential do metody LinkWithCredential zalogowanego użytkownika:

    // Link the new credential to the currently active user.
    firebase::auth::User current_user = auth->current_user();
    firebase::Future<firebase::auth::AuthResult> result =
        current_user.LinkWithCredential(credential);

    Wywołanie LinkWithCredential nie powiedzie się, jeśli dane logowania są już połączone z innym kontem użytkownika. W takiej sytuacji musisz odpowiednio połączyć konta i powiązane z nimi dane:

    // Gather data for the currently signed in User.
    firebase::auth::User current_user = auth->current_user();
    std::string current_email = current_user.email();
    std::string current_provider_id = current_user.provider_id();
    std::string current_display_name = current_user.display_name();
    std::string current_photo_url = current_user.photo_url();
    
    // Sign in with the new credentials.
    firebase::Future<firebase::auth::AuthResult> result =
        auth->SignInAndRetrieveDataWithCredential(credential);
    
    // To keep example simple, wait on the current thread until call completes.
    while (result.status() == firebase::kFutureStatusPending) {
      Wait(100);
    }
    
    // The new User is now active.
    if (result.error() == firebase::auth::kAuthErrorNone) {
      firebase::auth::User* new_user = *result.result();
    
      // Merge new_user with the user in details.
      // ...
      (void)new_user;
    }

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

Jedno konto użytkownika Firebase może być połączone z wieloma dostawcami uwierzytelniania (np. e-mail/hasło, Google, Facebook), co umożliwia użytkownikowi logowanie się na to samo konto Firebase różnymi metodami.

Jeśli odłączysz dostawcę uwierzytelniania od konta użytkownika, nie będzie on już mógł logować się za jego pomocą.

Aby odłączyć dostawcę uwierzytelniania od konta użytkownika, przekaż identyfikator dostawcy do metody Unlink. Identyfikatory dostawców uwierzytelniania powiązanych z użytkownikiem możesz uzyskać, wywołując ProviderData.

// Unlink the sign-in provider from the currently active user.
firebase::auth::User current_user = auth->current_user();
firebase::Future<firebase::auth::AuthResult> result =
    current_user.Unlink(providerId);

Rozwiązywanie problemów

Jeśli podczas próby połączenia kilku kont wystąpią błędy, zapoznaj się z dokumentacją dotyczącą zweryfikowanych adresów e-mail.