Vincular vários provedores de autenticação a uma conta no Android

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 FirebaseAuth.signInWith. 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 AuthCredential para o novo provedor de autenticação:

    Login do Google

    Kotlin

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)

    Java

    AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
    Login do Facebook

    Kotlin

    val credential = FacebookAuthProvider.getCredential(token.token)

    Java

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    Login com e-mail/senha

    Kotlin

    val credential = EmailAuthProvider.getCredential(email, password)

    Java

    AuthCredential credential = EmailAuthProvider.getCredential(email, password);
  4. Transmita o objeto AuthCredential ao método linkWithCredential do usuário conectado:

    Kotlin

    auth.currentUser!!.linkWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                Log.d(TAG, "linkWithCredential:success")
                val user = task.result?.user
                updateUI(user)
            } else {
                Log.w(TAG, "linkWithCredential:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }

    Java

    mAuth.getCurrentUser().linkWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "linkWithCredential:success");
                        FirebaseUser user = task.getResult().getUser();
                        updateUI(user);
                    } else {
                        Log.w(TAG, "linkWithCredential:failure", task.getException());
                        Toast.makeText(AnonymousAuthActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });

    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:

    Kotlin

    val prevUser = auth.currentUser
    auth.signInWithCredential(credential)
        .addOnSuccessListener { result ->
            val currentUser = result.user
            // Merge prevUser and currentUser accounts and data
            // ...
        }
        .addOnFailureListener {
            // ...
        }

    Java

    FirebaseUser prevUser = FirebaseAuth.getInstance().getCurrentUser();
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    FirebaseUser currentUser = task.getResult().getUser();
                    // Merge prevUser and currentUser accounts and data
                    // ...
                }
            });

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 getProviderData.

Kotlin

Firebase.auth.currentUser!!.unlink(providerId)
    .addOnCompleteListener(this) { task ->
        if (task.isSuccessful) {
            // Auth provider unlinked from account
            // ...
        }
    }

Java

mAuth.getCurrentUser().unlink(providerId)
        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    // Auth provider unlinked from account
                    // ...
                }
            }
        });

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.