Você pode permitir que os usuários façam login no seu aplicativo usando vários provedores de autenticação vinculando as credenciais do provedor de autenticação a uma conta de usuário existente. Os usuários são identificáveis pelo mesmo ID de usuário do Firebase, independentemente do provedor de autenticação usado para fazer login. Por exemplo, um usuário que fez login com uma senha pode vincular uma conta do Google e fazer login com qualquer um dos métodos no futuro. Ou um usuário anônimo pode vincular uma conta do Facebook e, posteriormente, fazer login no Facebook para continuar usando seu aplicativo.
Antes de você começar
Adicione suporte para dois ou mais provedores de autenticação (possivelmente incluindo autenticação anônima) ao seu aplicativo.
Vincular credenciais do provedor de autenticação a uma conta de usuário
Para vincular credenciais do provedor de autenticação a uma conta de usuário existente:
- Faça login do usuário usando qualquer provedor ou método de autenticação.
- Conclua o fluxo de login do novo provedor de autenticação até, mas não incluindo, chamar um dos métodos
FirebaseAuth.signInWith
. Por exemplo, obtenha o token de ID do Google, o token de acesso do Facebook ou o e-mail e a senha do usuário. Obtenha um
AuthCredential
para o novo provedor de autenticação:Login do Google
Kotlin+KTX
val credential = GoogleAuthProvider.getCredential(googleIdToken, null)
Java
AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
Entrar no Facebook
Kotlin+KTX
val credential = FacebookAuthProvider.getCredential(token.token)
Java
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
Login com senha de e-mail
Kotlin+KTX
val credential = EmailAuthProvider.getCredential(email, password)
Java
AuthCredential credential = EmailAuthProvider.getCredential(email, password);
Passe o objeto
AuthCredential
para o métodolinkWithCredential
do usuário conectado:Kotlin+KTX
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. Nessa situação, você deve mesclar as contas e os dados associados conforme apropriado para seu aplicativo:Kotlin+KTX
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 bem-sucedida, o usuário poderá fazer login usando qualquer provedor de autenticação vinculado e acessar os mesmos dados do Firebase.
Desvincular um provedor de autenticação de uma conta de usuário
Você pode desvincular um provedor de autenticação de uma conta para que o usuário não possa mais fazer login nesse provedor.
Para desvincular um provedor de autenticação de uma conta de usuário, passe o ID do provedor para o método unlink
. Você pode obter os IDs dos provedores de autenticação vinculados a um usuário chamando getProviderData
.
Kotlin+KTX
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 // ... } } });