Puede permitir que los usuarios inicien sesión en su aplicación utilizando múltiples proveedores de autenticación vinculando las credenciales del proveedor de autenticación a una cuenta de usuario existente. Los usuarios son identificables por el mismo ID de usuario de Firebase independientemente del proveedor de autenticación que utilizaron para iniciar sesión. Por ejemplo, un usuario que inició sesión con una contraseña puede vincular una cuenta de Google e iniciar sesión con cualquiera de los métodos en el futuro. O bien, un usuario anónimo puede vincular una cuenta de Facebook y luego, iniciar sesión en Facebook para continuar usando su aplicación.
Antes de que empieces
Agregue soporte para dos o más proveedores de autenticación (posiblemente incluida la autenticación anónima) a su aplicación.
Vincular las credenciales del proveedor de autenticación a una cuenta de usuario
Para vincular las credenciales del proveedor de autenticación a una cuenta de usuario existente:
- Inicie sesión como usuario utilizando cualquier proveedor o método de autenticación.
- Complete el flujo de inicio de sesión para el nuevo proveedor de autenticación hasta llamar a uno de los métodos
FirebaseAuth.signInWith
, pero sin incluirlo. Por ejemplo, obtenga el token de identificación de Google del usuario, el token de acceso de Facebook o el correo electrónico y la contraseña. Obtenga una
AuthCredential
para el nuevo proveedor de autenticación:Iniciar sesión en Google
Kotlin+KTX
val credential = GoogleAuthProvider.getCredential(googleIdToken, null)
Java
AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
Iniciar sesión en Facebook
Kotlin+KTX
val credential = FacebookAuthProvider.getCredential(token.token)
Java
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
Inicio de sesión con contraseña de correo electrónico
Kotlin+KTX
val credential = EmailAuthProvider.getCredential(email, password)
Java
AuthCredential credential = EmailAuthProvider.getCredential(email, password);
Pase el objeto
AuthCredential
al métodolinkWithCredential
del usuario que inició sesión: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); } } });
La llamada a
linkWithCredential
fallará si las credenciales ya están vinculadas a otra cuenta de usuario. En esta situación, debe gestionar la combinación de las cuentas y los datos asociados según corresponda para su aplicación: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 // ... } });
Si la llamada a linkWithCredential
tiene éxito, el usuario ahora puede iniciar sesión con cualquier proveedor de autenticación vinculado y acceder a los mismos datos de Firebase.
Desvincular un proveedor de autenticación de una cuenta de usuario
Puede desvincular un proveedor de autenticación de una cuenta, de modo que el usuario ya no pueda iniciar sesión con ese proveedor.
Para desvincular un proveedor de autenticación de una cuenta de usuario, pase el ID del proveedor al método unlink
. Puede obtener los ID de los proveedores de autenticación vinculados a un usuario llamando 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 // ... } } });