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

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ę za pomocą hasła, może połączyć konto Google i zalogować się za pomocą dowolnej metody w przyszłości. Lub anonimowy użytkownik może połączyć konto na Facebooku, a następnie później zalogować się na Facebooku, aby nadal korzystać z Twojej aplikacji.

Zanim zaczniesz

Dodaj do swojej aplikacji obsługę co najmniej dwóch dostawców uwierzytelniania (być może łącznie z uwierzytelnianiem anonimowym).

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

  1. Zaloguj użytkownika przy użyciu dowolnego dostawcy lub metody uwierzytelniania.
  2. Ukończ przepływ logowania dla nowego dostawcy uwierzytelniania do, ale nie wliczając, wywołania jednej z metod firebase::auth::Auth::SignInWithCredential . 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(google_id_token,
                                                          nullptr);
    
    Logowanie do Facebooka
    firebase::auth::Credential credential =
        firebase::auth::FacebookAuthProvider::GetCredential(access_token);
    
    E-mail-hasło logowania
    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 zakończy się niepowodzeniem, jeśli poświadczenia są już połączone z innym kontem użytkownika. W tej sytuacji musisz zająć się łączeniem kont i powiązanych danych odpowiednio do swojej aplikacji:

    // 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 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 Unlink . Możesz uzyskać identyfikatory dostawców dostawców uwierzytelniania połączonych z użytkownikiem, 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);