Ir para o console

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 código do Firebase identifica usuários de qualquer provedor de login. 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.

Vincular credenciais de provedor de autenticação a uma conta de usuário

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

  1. Faça login usando qualquer provedor ou método de autenticação.
  2. Conclua o fluxo de login do novo provedor de autenticação até a chamada de um dos métodos FirebaseAuth.signInWith, mas sem incluir essa etapa. Por exemplo, obtenha o token do código do Google do usuário, 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

    Java
    Android

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

    Kotlin
    Android

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

    Java
    Android

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());

    Kotlin
    Android

    val credential = FacebookAuthProvider.getCredential(token.token)
    Login com e-mail/senha

    Java
    Android

    AuthCredential credential = EmailAuthProvider.getCredential(email, password);

    Kotlin
    Android

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

    Java
    Android

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

    Kotlin
    Android

    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)
                }
    
                // ...
            }

    A chamada ao linkWithCredential não funciona com credenciais já vinculadas a outra conta de usuário. Nesse caso, você precisará mesclar as contas e os dados associados da maneira apropriada para o app:

    Java
    Android

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

    Kotlin
    Android

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

Se a chamada ao linkWithCredential funcionar, o usuário poderá fazer login com um dos provedores de autenticação vinculados e acessar os dados do Firebase.

Desvincular um provedor de autenticação de uma conta de usuário

É possível desvincular um provedor de autenticação de uma conta para que o usuário não faça mais login com ele.

Para desvincular um provedor de uma conta de usuário, transmita o código dele para o método unlink. Para receber os códigos dos provedores de autenticação vinculados a um usuário, chame getProviderData.

Java
Android

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

Kotlin
Android

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