Para permitir que los usuarios accedan a la app con varios proveedores de autenticación, puedes vincular las credenciales de estos proveedores con una cuenta de usuario existente. Los usuarios se pueden identificar por el mismo ID de usuario de Firebase, sin importar el proveedor de autenticación que hayan usado para acceder. Por ejemplo, un usuario que accedió con una contraseña puede vincular una cuenta de Google y después usar cualquiera de los dos métodos para acceder. Por otra parte, un usuario anónimo puede vincular una cuenta de Facebook y luego acceder con Facebook para continuar usando la app.
Antes de comenzar
Agrega compatibilidad para dos o más proveedores de autenticación (posiblemente incluida la autenticación anónima) a tu app.
Vincula credenciales federadas de proveedores de autenticación con una cuenta de usuario
Para vincular credenciales de un proveedor de autenticación como Google o Facebook con una cuenta de usuario existente, haz lo siguiente:
- Haz que el usuario acceda con cualquier proveedor o método de autenticación.
- Obtén el objeto
AuthProvider
que corresponde al proveedor que deseas vincular con la cuenta del usuario. Ejemplos:var provider = new firebase.auth.GoogleAuthProvider(); var provider = new firebase.auth.FacebookAuthProvider(); var provider = new firebase.auth.TwitterAuthProvider(); var provider = new firebase.auth.GithubAuthProvider();
- Solicita al usuario que acceda con el proveedor que deseas vincular. Para pedir a tus usuarios que accedan, puedes mostrar una ventana emergente o redireccionarlos a la página de acceso del proveedor. En dispositivos móviles, se prefiere el método de redireccionamiento.
- Para acceder con una ventana emergente, llama a
linkWithPopup
:auth.currentUser.linkWithPopup(provider).then(function(result) { // Accounts successfully linked. var credential = result.credential; var user = result.user; // ... }).catch(function(error) { // Handle Errors here. // ... });
- Para acceder mediante el redireccionamiento a la página de acceso del proveedor, llama a
linkWithRedirect
:auth.currentUser.linkWithRedirect(provider);
Después de que el usuario accede, se lo redirecciona de vuelta a tu página. Luego, para recuperar el resultado del acceso, puedes llamar agetRedirectResult
cuando tu página cargue el siguiente código:firebase.auth().getRedirectResult().then(function(result) { if (result.credential) { // Accounts successfully linked. var credential = result.credential; var user = result.user; // ... } }).catch(function(error) { // Handle Errors here. // ... });
La vinculación de cuentas fallará si ya se vincularon las credenciales con la cuenta de otro usuario. En esta situación, debes administrar la fusión de las cuentas y los datos asociados según corresponda para la app:
// Get reference to the currently signed-in user var prevUser = auth.currentUser; // Sign in user with another account auth.signInWithCredential(credential).then(function(user) { console.log("Sign In Success", user); var currentUser = user; // Merge prevUser and currentUser data stored in Firebase. // Note: How you handle this is specific to your application // After data is migrated delete the duplicate user return user.delete().then(function() { // Link the OAuth Credential to original account return prevUser.linkWithCredential(credential); }).then(function() { // Sign in with the newly linked credential return auth.signInWithCredential(credential); }); }).catch(function(error) { console.log("Sign In Error", error); });
- Para acceder con una ventana emergente, llama a
Vincula credenciales de dirección de correo electrónico y contraseña con una cuenta de usuario
Para agregar credenciales de dirección de correo electrónico y contraseña a una cuenta de usuario existente, sigue estos pasos:
- Haz que el usuario acceda con cualquier proveedor o método de autenticación.
- Pide al usuario que ingrese una dirección de correo electrónico y una contraseña nueva.
- Crea un objeto
AuthCredential
con la dirección de correo electrónico y la contraseña:var credential = firebase.auth.EmailAuthProvider.credential(email, password);
Pasa el objeto
AuthCredential
al métodolinkWithCredential
del usuario que accedió:firebase.auth().currentUser.linkWithCredential(credential).then(function(usercred) { var user = usercred.user; console.log("Account linking success", user); }, function(error) { console.log("Account linking error", error); });
La llamada a
linkWithCredential
fallará si ya se vincularon las credenciales con la cuenta de otro usuario. En esta situación, debes administrar la fusión de las cuentas y los datos asociados según corresponda para tu app:// Get reference to the currently signed-in user var prevUser = auth.currentUser; // Sign in user with another account auth.signInWithCredential(credential).then(function(user) { console.log("Sign In Success", user); var currentUser = user; // Merge prevUser and currentUser data stored in Firebase. // Note: How you handle this is specific to your application // After data is migrated delete the duplicate user return user.delete().then(function() { // Link the OAuth Credential to original account return prevUser.linkWithCredential(credential); }).then(function() { // Sign in with the newly linked credential return auth.signInWithCredential(credential); }); }).catch(function(error) { console.log("Sign In Error", error); });
Desvincula un proveedor de autenticación de una cuenta de usuario
Puedes desvincular un proveedor de autenticación de una cuenta para que el usuario ya no pueda acceder con ese proveedor.
Para desvincular un proveedor de autenticación de una cuenta de usuario, pasa el ID del proveedor al método unlink
. Puedes obtener los ID de los proveedores de autenticación vinculados con un usuario desde la propiedad providerData
.
user.unlink(providerId).then(function() { // Auth provider unlinked from account }).catch(function(error) { // An error happened });