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 federado a una cuenta de usuario
Para vincular credenciales de un proveedor de autenticación como Google o Facebook a una cuenta de usuario existente:
- Inicie sesión como usuario utilizando cualquier proveedor o método de autenticación.
- Obtenga el objeto
AuthProvider
que corresponde al proveedor que desea vincular a la cuenta del usuario. Ejemplos:Web modular API
import { GoogleAuthProvider, FacebookAuthProvider, TwitterAuthProvider, GithubAuthProvider } from "firebase/auth"; const googleProvider = new GoogleAuthProvider(); const facebookProvider = new FacebookAuthProvider(); const twitterProvider = new TwitterAuthProvider(); const githubProvider = new GithubAuthProvider();
Web namespaced API
var googleProvider = new firebase.auth.GoogleAuthProvider(); var facebookProvider = new firebase.auth.FacebookAuthProvider(); var twitterProvider = new firebase.auth.TwitterAuthProvider(); var githubProvider = new firebase.auth.GithubAuthProvider();
- Solicite al usuario que inicie sesión con el proveedor que desea vincular. Puede solicitar a sus usuarios que inicien sesión abriendo una ventana emergente o redirigiéndolos a la página de inicio de sesión del proveedor. Se prefiere el método de redireccionamiento en dispositivos móviles.
- Para iniciar sesión con una ventana emergente, llame
linkWithPopup
:Web modular API
import { getAuth, linkWithPopup, GoogleAuthProvider } from "firebase/auth"; const provider = new GoogleAuthProvider(); const auth = getAuth(); linkWithPopup(auth.currentUser, provider).then((result) => { // Accounts successfully linked. const credential = GoogleAuthProvider.credentialFromResult(result); const user = result.user; // ... }).catch((error) => { // Handle Errors here. // ... });
Web namespaced API
auth.currentUser.linkWithPopup(provider).then((result) => { // Accounts successfully linked. var credential = result.credential; var user = result.user; // ... }).catch((error) => { // Handle Errors here. // ... });
- Para iniciar sesión redirigiendo a la página de inicio de sesión del proveedor, llame a
linkWithRedirect
: siga las mejores prácticas al utilizar `linkWithRedirect`.Una vez que el usuario inicia sesión, se le redirige a su página. Luego, puedes recuperar el resultado del inicio de sesión llamandoWeb modular API
import { getAuth, linkWithRedirect, GoogleAuthProvider } from "firebase/auth"; const provider = new GoogleAuthProvider(); const auth = getAuth(); linkWithRedirect(auth.currentUser, provider) .then(/* ... */) .catch(/* ... */);
Web namespaced API
auth.currentUser.linkWithRedirect(provider) .then(/* ... */) .catch(/* ... */);
getRedirectResult
cuando se carga tu página:Web modular API
import { getRedirectResult } from "firebase/auth"; getRedirectResult(auth).then((result) => { const credential = GoogleAuthProvider.credentialFromResult(result); if (credential) { // Accounts successfully linked. const user = result.user; // ... } }).catch((error) => { // Handle Errors here. // ... });
Web namespaced API
auth.getRedirectResult().then((result) => { if (result.credential) { // Accounts successfully linked. var credential = result.credential; var user = result.user; // ... } }).catch((error) => { // Handle Errors here. // ... });
La vinculación de cuentas 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:
Web modular API
import { getAuth, signInWithCredential, linkWithCredential, OAuthProvider } from "firebase/auth"; // The implementation of how you store your user data depends on your application const repo = new MyUserDataRepo(); // Get reference to the currently signed-in user const auth = getAuth(); const prevUser = auth.currentUser; // Get the data which you will want to merge. This should be done now // while the app is still signed in as this user. const prevUserData = repo.get(prevUser); // Delete the user's data now, we will restore it if the merge fails repo.delete(prevUser); // Sign in user with the account you want to link to signInWithCredential(auth, newCredential).then((result) => { console.log("Sign In Success", result); const currentUser = result.user; const currentUserData = repo.get(currentUser); // Merge prevUser and currentUser data stored in Firebase. // Note: How you handle this is specific to your application const mergedData = repo.merge(prevUserData, currentUserData); const credential = OAuthProvider.credentialFromResult(result); return linkWithCredential(prevUser, credential) .then((linkResult) => { // Sign in with the newly linked credential const linkCredential = OAuthProvider.credentialFromResult(linkResult); return signInWithCredential(auth, linkCredential); }) .then((signInResult) => { // Save the merged data to the new user repo.set(signInResult.user, mergedData); }); }).catch((error) => { // If there are errors we want to undo the data merge/deletion console.log("Sign In Error", error); repo.set(prevUser, prevUserData); });
Web namespaced API
// The implementation of how you store your user data depends on your application var repo = new MyUserDataRepo(); // Get reference to the currently signed-in user var prevUser = auth.currentUser; // Get the data which you will want to merge. This should be done now // while the app is still signed in as this user. var prevUserData = repo.get(prevUser); // Delete the user's data now, we will restore it if the merge fails repo.delete(prevUser); // Sign in user with the account you want to link to auth.signInWithCredential(newCredential).then((result) => { console.log("Sign In Success", result); var currentUser = result.user; var currentUserData = repo.get(currentUser); // Merge prevUser and currentUser data stored in Firebase. // Note: How you handle this is specific to your application var mergedData = repo.merge(prevUserData, currentUserData); return prevUser.linkWithCredential(result.credential) .then((linkResult) => { // Sign in with the newly linked credential return auth.signInWithCredential(linkResult.credential); }) .then((signInResult) => { // Save the merged data to the new user repo.set(signInResult.user, mergedData); }); }).catch((error) => { // If there are errors we want to undo the data merge/deletion console.log("Sign In Error", error); repo.set(prevUser, prevUserData); });
- Para iniciar sesión con una ventana emergente, llame
Vincular las credenciales de dirección de correo electrónico y contraseña a una cuenta de usuario
Para agregar credenciales de dirección de correo electrónico y contraseña a una cuenta de usuario existente:
- Inicie sesión como usuario utilizando cualquier proveedor o método de autenticación.
- Solicite al usuario una dirección de correo electrónico y una nueva contraseña.
- Cree un objeto
AuthCredential
con la dirección de correo electrónico y la contraseña:Web modular API
import { EmailAuthProvider } from "firebase/auth"; const credential = EmailAuthProvider.credential(email, password);
Web namespaced API
var credential = firebase.auth.EmailAuthProvider.credential(email, password);
Pase el objeto
AuthCredential
al métodolinkWithCredential
del usuario que inició sesión:Web modular API
import { getAuth, linkWithCredential } from "firebase/auth"; const auth = getAuth(); linkWithCredential(auth.currentUser, credential) .then((usercred) => { const user = usercred.user; console.log("Account linking success", user); }).catch((error) => { console.log("Account linking error", error); });
Web namespaced API
auth.currentUser.linkWithCredential(credential) .then((usercred) => { var user = usercred.user; console.log("Account linking success", user); }).catch((error) => { console.log("Account linking error", error); });
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 (consulte el ejemplo anterior).
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 desde la propiedad providerData
.
Web modular API
import { getAuth, unlink } from "firebase/auth"; const auth = getAuth(); unlink(auth.currentUser, providerId).then(() => { // Auth provider unlinked from account // ... }).catch((error) => { // An error happened // ... });
Web namespaced API
user.unlink(providerId).then(() => { // Auth provider unlinked from account // ... }).catch((error) => { // An error happened // ... });