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 con 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 la app.
Vincula las credenciales del proveedor de autenticación con una cuenta de usuario
Para vincular las credenciales del proveedor de autenticación con una cuenta de usuario existente:
Permite que el usuario acceda mediante cualquier proveedor o método de autenticación.
Completa el flujo de acceso del proveedor de autenticación nuevo, pero solamente hasta el paso anterior a llamar a uno de los métodos
signInWith
. Por ejemplo, obtén el token de ID de Google, el token de acceso de Facebook o el correo electrónico y la contraseña del usuario.Obtén un objeto
Credential
para el proveedor de autenticación nuevo:// Google Sign-in final credential = GoogleAuthProvider.credential(idToken: idToken); // Email and password sign-in final credential = EmailAuthProvider.credential(email: emailAddress, password: password); // Etc.
Pasa el objeto
Credential
al métodolinkWithCredential()
del usuario que accedió:try { final userCredential = await FirebaseAuth.instance.currentUser ?.linkWithCredential(credential); } on FirebaseAuthException catch (e) { switch (e.code) { case "provider-already-linked": print("The provider has already been linked to the user."); break; case "invalid-credential": print("The provider's credential is not valid."); break; case "credential-already-in-use": print("The account corresponding to the credential already exists, " "or is already linked to a Firebase User."); break; // See the API reference for the full list of error codes. default: print("Unknown error."); } ```
Si la llamada a linkWithCredential()
se hace correctamente, el usuario podrá acceder con
cualquier proveedor de autenticación vinculado para usar los mismos datos en Firebase.
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
del objeto User
.
try {
await FirebaseAuth.instance.currentUser?.unlink(providerId);
} on FirebaseAuthException catch (e) {
switch (e.code) {
case "no-such-provider":
print("The user isn't linked to the provider or the provider "
"doesn't exist.");
break;
default:
print("Unknown error.");
}
}