Manejo de errores

Los SDK de autenticación de Firebase proporcionan una forma sencilla de detectar los diversos errores que pueden ocurrir al utilizar métodos de autenticación. Los SDK para Flutter exponen estos errores a través de la clase FirebaseAuthException .

Como mínimo, se proporcionan un code y message ; sin embargo, en algunos casos, también se proporcionan propiedades adicionales, como una dirección de correo electrónico y una credencial. Por ejemplo, si el usuario intenta iniciar sesión con un correo electrónico y una contraseña, cualquier error que se produzca se puede detectar explícitamente:

try {
  await FirebaseAuth.instance.signInWithEmailAndPassword(
    email: "barry.allen@example.com",
    password: "SuperSecretPassword!"
  );
} on FirebaseAuthException catch  (e) {
  print('Failed with error code: ${e.code}');
  print(e.message);
}

Cada método proporciona varios códigos de error y mensajes según el tipo de invocación de autenticación. La API de referencia proporciona detalles actualizados sobre los errores de cada método.

Se pueden generar otros errores, como too-many-requests u operation-not-allowed , si alcanza la cuota de autenticación de Firebase o no ha habilitado un proveedor de autenticación específico.

Manejo de errores account-exists-with-different-credential

Si habilitó la configuración Una cuenta por dirección de correo electrónico en Firebase console , cuando un usuario intenta iniciar sesión en un proveedor (como Google) con un correo electrónico que ya existe para el proveedor de otro usuario de Firebase (como Facebook), aparecerá el error. auth/account-exists-with-different-credential se lanza junto con una clase AuthCredential (token de ID de Google). Para completar el flujo de inicio de sesión con el proveedor deseado, el usuario primero debe iniciar sesión en el proveedor existente (por ejemplo, Facebook) y luego vincularse a la antigua AuthCredential (token de identificación de Google).

FirebaseAuth auth = FirebaseAuth.instance;

// Create a credential from a Google Sign-in Request
var googleAuthCredential = GoogleAuthProvider.credential(accessToken: 'xxxx');

try {
  // Attempt to sign in the user in with Google
  await auth.signInWithCredential(googleAuthCredential);
} on FirebaseAuthException catch (e) {
  if (e.code == 'account-exists-with-different-credential') {
    // The account already exists with a different credential
    String email = e.email;
    AuthCredential pendingCredential = e.credential;

    // Fetch a list of what sign-in methods exist for the conflicting user
    List<String> userSignInMethods = await auth.fetchSignInMethodsForEmail(email);

    // If the user has several sign-in methods,
    // the first method in the list will be the "recommended" method to use.
    if (userSignInMethods.first == 'password') {
      // Prompt the user to enter their password
      String password = '...';

      // Sign the user in to their account with the password
      UserCredential userCredential = await auth.signInWithEmailAndPassword(
        email: email,
        password: password,
      );

      // Link the pending credential with the existing account
      await userCredential.user.linkWithCredential(pendingCredential);

      // Success! Go back to your application flow
      return goToApplication();
    }

    // Since other providers are now external, you must now sign the user in with another
    // auth provider, such as Facebook.
    if (userSignInMethods.first == 'facebook.com') {
      // Create a new Facebook credential
      String accessToken = await triggerFacebookAuthentication();
      var facebookAuthCredential = FacebookAuthProvider.credential(accessToken);

      // Sign the user in with the credential
      UserCredential userCredential = await auth.signInWithCredential(facebookAuthCredential);

      // Link the pending credential with the existing account
      await userCredential.user.linkWithCredential(pendingCredential);

      // Success! Go back to your application flow
      return goToApplication();
    }

    // Handle other OAuth providers...
  }
}