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

Możesz zezwolić użytkownikom na logowanie się w aplikacji przy użyciu wielokrotnego uwierzytelniania. przez połączenie danych logowania dostawcy uwierzytelniania z istniejącym kontem użytkownika. Użytkowników można zidentyfikować na podstawie tego samego identyfikatora użytkownika Firebase niezależnie od parametru dostawcy uwierzytelniania, którego użyli do logowania. Na przykład: użytkownik, który zalogował się hasła, możesz połączyć konto Google i zalogować się za pomocą dowolnej z tych metod w przyszłości. Anonimowy użytkownik może też połączyć konto na Facebooku, a później się zalogować z Facebookiem, aby dalej korzystać z aplikacji.

Zanim zaczniesz

Dodanie obsługi co najmniej 2 dostawców uwierzytelniania (możesz uwzględnić anonimowego uwierzytelniania).

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

  1. Zaloguj użytkownika przy użyciu dowolnego dostawcy lub metody uwierzytelniania.
  2. Przeprowadź proces logowania w przypadku nowego dostawcy uwierzytelniania do, ale nie na przykład przez wywołanie jednej z metod firebase::auth::Auth::SignInWithCredential. Na przykład pobierz token identyfikatora Google użytkownika, token dostępu Facebooka lub adres e-mail i hasło.
  3. Pobierz firebase::auth::Credential dla nowego dostawcy uwierzytelniania:

    Logowanie przez 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);
    
    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 folderu zalogowanego użytkownika Metoda LinkWithCredential:

    // 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 dane logowania są już połączone z innym kontem użytkownika. W takiej sytuacji musisz użyć Połączenie kont i powiązanych z nimi danych odpowiednio do potrzeb 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 się powiedzie, użytkownik może się teraz zalogować za pomocą dowolnego połączonego dostawcy uwierzytelniania i mieć dostęp do tych samych danych Firebase.

Możesz odłączyć dostawcę uwierzytelniania od konta, aby użytkownik nie mógł zalogować się na jego konto.

Aby odłączyć dostawcę uwierzytelniania od konta użytkownika, przekaż identyfikator dostawcy do Metoda Unlink. Możesz uzyskać identyfikatory dostawców uwierzytelniania powiązane z użytkownikiem przez wywołanie 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);