Gestion des erreurs

Les SDK Firebase Authentication permettent de détecter facilement les différentes erreurs qui peuvent se produire, méthodes d'authentification. Les SDK pour Flutter exposent ces erreurs via la classe FirebaseAuthException.

Au minimum, un code et un message sont fournis. Toutefois, dans certains cas, des propriétés supplémentaires telles qu'une adresse e-mail et des identifiants sont également fournies. Par exemple, si l'utilisateur tente de se connecter avec une adresse e-mail et un mot de passe, toutes les erreurs générées peuvent être détectées explicitement :

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);
}

Chaque méthode fournit différents codes et messages d'erreur en fonction du type d'appel d'authentification. La documentation de référence de l'API fournit des informations à jour sur les erreurs pour chaque méthode.

D'autres erreurs telles que too-many-requests ou operation-not-allowed peuvent se produire si vous atteignez le quota Firebase Authentication ou si vous n'avez pas activé un fournisseur d'authentification spécifique.

Gérer les erreurs account-exists-with-different-credential

Si vous avez activé le paramètre "Un compte par adresse e-mail" dans la console Firebase : Lorsqu'un utilisateur tente de se connecter à un fournisseur (tel que Google) avec une adresse e-mail qui existe déjà pour le fournisseur d'un autre utilisateur Firebase (Facebook, par exemple), l'erreur auth/account-exists-with-different-credential est générée avec une classe AuthCredential (jeton d'ID Google). Pour terminer le flux de connexion vers le fournisseur souhaité, l'utilisateur doit d'abord se connecter au fournisseur existant (par exemple, Facebook), puis créer un lien vers l'ancien AuthCredential (jeton d'ID 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...
  }
}