Gestion des erreurs

Les SDK Firebase Authentication permettent de détecter facilement les différentes erreurs pouvant se produire lors de l'utilisation de 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. L'API de référence 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 existant déjà pour le fournisseur d'un autre utilisateur Firebase (tel que Facebook), l'erreur auth/account-exists-with-different-credential est générée avec une classe AuthCredential (jeton d'ID Google). Pour terminer le parcours de connexion au fournisseur souhaité, l'utilisateur doit d'abord se connecter au fournisseur existant (par exemple, Facebook), puis l'associer à 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...
  }
}