Vincular vários provedores de autenticação a uma conta usando C++

Ao vincular as credenciais de provedores de autenticação a contas de usuário existentes, você permite que esses usuários façam login no seu app usando diferentes provedores. O ID do Firebase identifica usuários de qualquer provedor de autenticação. Por exemplo, um usuário que fez login com uma senha pode vincular uma Conta do Google e usar um desses métodos. Ou um usuário anônimo pode vincular uma conta do Facebook para acessar o app.

Antes de começar

No app, adicione suporte a dois ou mais provedores de autenticação, incluindo autenticação anônima.

Para vincular credenciais de provedores de autenticação a uma conta de usuário, faça o seguinte:

  1. Faça login com algum provedor ou método de autenticação.
  2. Conclua o fluxo de login para o novo provedor de autenticação até a chamada de um dos métodos firebase::auth::Auth::SignInWithCredential. Por exemplo, use o token de ID do Google, o token de acesso do Facebook ou o e-mail e a senha.
  3. Receba um firebase::auth::Credential para o novo provedor de autenticação:

    Login do Google
    firebase::auth::Credential credential =
        firebase::auth::GoogleAuthProvider::GetCredential(google_id_token,
                                                          nullptr);
    Login do Facebook
    firebase::auth::Credential credential =
        firebase::auth::FacebookAuthProvider::GetCredential(access_token);
    Login com e-mail/senha
    firebase::auth::Credential credential =
        firebase::auth::EmailAuthProvider::GetCredential(email, password);
  4. Transmita o objeto firebase::auth::Credential ao método LinkWithCredential do usuário conectado:

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

    A chamada para LinkWithCredential falhará se as credenciais já estiverem vinculadas a outra conta de usuário. Nesse caso, você precisará mesclar as contas e os dados associados da maneira apropriada para o app:

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

Se a chamada para LinkWithCredential for concluída, o usuário poderá fazer login com um dos provedores de autenticação vinculados e acessar os dados do Firebase.

Uma única conta de usuário do Firebase pode ter vários provedores de autenticação vinculados a ela (por exemplo, e-mail/senha, Google, Facebook), o que permite que o usuário faça login na mesma conta do Firebase por diferentes métodos.

Se você desvincular um provedor de autenticação da conta de um usuário, ele não poderá mais fazer login com esse provedor.

Para desvincular um provedor de autenticação de uma conta de usuário, transmita o ID dele ao método Unlink. Se quiser receber os códigos dos provedores de autenticação vinculados a um usuário, chame 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);

Solução de problemas

Se você encontrar erros ao tentar vincular várias contas, consulte a documentação sobre endereços de e-mail verificados.