2
votes

onAuthStateChanged n'est pas appelé lorsque l'e-mail est vérifié en flutter

Lorsqu'un utilisateur s'inscrit dans mon application, il reçoit un e-mail de vérification. L'écouteur onAuthStateChanged est appelé lorsqu'un utilisateur est créé en utilisant createUserWithEmailAndPassword mais pas après que l'e-mail a été vérifié.

J'ai une classe distincte qui gère toutes les authentifications. La méthode suivante consiste à inscrire l'utilisateur

  FirebaseAuth.instance.onAuthStateChanged.listen((user) {
  print("Auth State Changed!");
  if (user.isEmailVerified) {
    print("EMail verified!");
  }
  }

Cette méthode est appelée dans mon StatefulWidget en utilisant cette méthode

void _signUpUser() async {
try {
  await Auth().signUpUser(_email, _password)
    ..sendEmailVerification();
} catch (e) {
  print(e.toString());
}
}

Et onAuthStateChanged est configuré dans la méthode initState de mon StatefulWidget

Future<FirebaseUser> signUpUser(email, password) async {
final FirebaseUser user = await _auth.createUserWithEmailAndPassword(email: email, password: password);

assert (user != null);
assert (await user.getIdToken() != null);

return user;
}


2 commentaires

Y a-t-il quelque chose dans la documentation indiquant que l'utilisateur sera automatiquement connecté lorsque l'e-mail est vérifié? En outre, il se pourrait peut-être que l'authStatechanged ne soit appelé qu'une seule fois, après l'enregistrement, lorsque l'e-mail ne sera toujours pas vérifié et que l'utilisateur devra fermer et ouvrir l'application.


stackoverflow.com/a/58039313/10511266 peut vous aider.


4 Réponses :


2
votes

onAuthStatechanged est déclenché uniquement en cas de connexion ou de déconnexion de l'utilisateur et non lors de la vérification de l'e-mail.

Selon Doc -

onAuthStatechanged Ajoute un observateur pour les modifications de l'état de connexion de l'utilisateur.

L'observateur sera déclenché dans les scénarios suivants:

  • Lorsque auth (). onAuthStateChanged () est appelé pour la première fois. Il se déclenchera avec l'état initial d'Auth. Si l'utilisateur revient d'un auth (). signInWithRedirect (), l'observateur attendra cela opération à résoudre avant le déclenchement initial.

  • Lorsqu'un nouvel utilisateur se connecte.

  • Lorsqu'un utilisateur déjà connecté se déconnecte.


2 commentaires

Mais comment est-il alors possible d'être averti lorsque l'utilisateur a vérifié son email?


Vous pouvez forcer le rechargement du jeton d'identification, ce qui vous donnera la nouvelle valeur. Je ne sais jamais si User.reload suffit, ou si vous devez appeler getIdToken (true) avant cela.



1
votes

Pour le moment, je propose un bouton pour «terminer la validation des e-mails». Cela appelle User.reload - donc cela semble être suffisant pour le commentaire de @Frank van Puffelen ci-dessus. C'est beaucoup moins satisfaisant que d'obtenir un événement de mise à jour de statut; Je peux implémenter une boucle pour vérifier l'état pendant une période après l'envoi d'un e-mail afin que l'application passe automatiquement.


0 commentaires

0
votes

Utilisez la fonction where:

final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;

  Stream<FirebaseUser> get onAuthStateChanged {
    return _firebaseAuth.onAuthStateChanged.where((user)=> user.isEmailVerified);
  }


0 commentaires

0
votes

Vous pouvez simplement faire un firebase.auth (). signOut après avoir envoyé le lien de vérification par e-mail. Et lorsque l'utilisateur clique à nouveau sur la connexion, il se déclenche automatiquement surAuthStateChanged.


0 commentaires