Descubre las novedades de Firebase en Google I/O 2022. Más información

Vincular múltiples proveedores de autenticación a una cuenta

Puede permitir que los usuarios inicien sesión en su aplicación utilizando varios 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 usaron 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 cualquier método en el futuro. O bien, un usuario anónimo puede vincular una cuenta de Facebook y luego, luego, iniciar sesión con 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.

Para vincular las credenciales del proveedor de autenticación a una cuenta de usuario existente:

  1. Inicie sesión con el usuario mediante cualquier proveedor o método de autenticación.

  2. Complete el flujo de inicio de sesión para el nuevo proveedor de autenticación hasta, pero sin incluir, llamar a uno de los métodos signInWith -. Por ejemplo, obtenga el token de ID de Google del usuario, el token de acceso de Facebook o el correo electrónico y la contraseña.

  3. Obtenga un objeto de Credential para el nuevo proveedor de autenticación:

    // Google Sign-in
    final credential = GoogleAuthProvider.credential(idToken: idToken);
    
    // Email and password sign-in
    final credential =
        EmailAuthProvider.credential(email: emailAddress, password: password);
    
    // Etc.
    
  4. Pase el objeto Credential al método linkWithCredential() del usuario de inicio de sesión:

    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() tiene éxito, el usuario ahora puede iniciar sesión con cualquier proveedor de autenticación vinculado y acceder a los mismos datos de Firebase.

Puede desvincular un proveedor de autenticación de una cuenta para 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 la ID del proveedor al método unlink() . Puede obtener los ID de proveedor de los proveedores de autenticación vinculados a 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("Unkown error.");
  }
}