Flutter Firebase Auth - Attraper un jeton expiré

Sep 18 2020

J'utilise le plugin Firebase Auth pour l'authentification de mon application Flutter.

Jusqu'à la mise à niveau (pas sûr si pertinent) vers la dernière version d'authentification Firebase:

firebase_core: ^0.5.0
firebase_auth: ^0.18.0+1

tout a bien fonctionné.

Maintenant, j'ai, pour la première fois, l'erreur Sentry:

FirebaseAuthException: [firebase_auth/user-token-expired] The user's credential is no longer valid. The user must sign in again.
  File "exception.dart", line 20, in catchPlatformException
  File "zone.dart", line 1198, in _rootRunUnary
  File "zone.dart", line 1100, in _CustomZone.runUnary
  File "future_impl.dart", line 160, in _FutureListener.handleError
  File "future_impl.dart", line 708, in Future._propagateToListeners.handleError
  File "future_impl.dart", line 729, in Future._propagateToListeners
  File "future_impl.dart", line 537, in Future._completeError
  File "async_patch.dart", line 47, in _AsyncAwaitCompleter.completeError
  File "platform_channel.dart", in MethodChannel.invokeMapMethod
  File "<asynchronous suspension>"
  File "unparsed"

Comment cela peut-il arriver? L'utilisateur a déclaré qu'il n'avait pas utilisé cette application pendant quelques jours. Si je comprends bien la documentation d'authentification Firebase, le jeton d'authentification est automatiquement actualisé avec le jeton d'actualisation.

Comment puis-je atténuer ce problème?

Où / comment puis-je intercepter cette exception pour rediriger un utilisateur vers l'écran de connexion?

Réponses

1 AnuragTripathi Sep 18 2020 at 14:47

Vous pouvez faire deux choses,

Premièrement :

lorsqu'un utilisateur démarre votre application, vous devez d'abord vérifier si l'utilisateur est déjà connecté ou non, s'il l'est, puis vous connecter en silence, sinon, puis envoyer l'utilisateur à la page de connexion, ci-dessous est un exemple d'une application I build il y a quatre mois (vous devrez ajouter une dépendance google_sign_in à votre application)

class _StartingPageState extends State<StartingPage> {

  Future<dynamic> decideStartingPage() async {
    bool isUserSignedIn  = await googleSignIn.isSignedIn();

    if (isUserSignedIn == true) {
      FirebaseUser futurefbuser =await getCurrentFirebaseUser();
      assignFireBaseUser(futurefbuser);
      await googleSignIn.signInSilently();
      return HomeTabView();
    }
    else
      return LoginPage();
  }

  Future<dynamic> startingpage;

  @override
  void initState(){
    super.initState();
    startingpage=decideStartingPage();
    FirebaseAdMob.instance.initialize(appId: "ca-app-pub-...........");
  }

   @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future:startingpage,
      builder: (BuildContext ctx, AsyncSnapshot<dynamic> snapshot) {
        if (snapshot.connectionState != ConnectionState.done) {
          return Center( child : const CircularProgressIndicator());
        }
        else
          return snapshot.data;
      }
    );
  }
}

Seconde:

La deuxième chose que vous pouvez faire est d'enregistrer le jeton d'accès et (ou) le jeton d'actualisation que vous obtenez lorsqu'un utilisateur se connecte, lorsque cela expire, vous pouvez obtenir un autre jeton d'accès à l'aide du jeton d'actualisation. Cela signifie un peu de travail supplémentaire pour vous car vous devrez enregistrer le jeton dans les préférences partagées ou dans un fichier json.

Maintenant, où ajouter le code pour qui gère la procédure ci-dessus? Vous devez identifier la première chose que seul un utilisateur authentifié peut faire comme écrire dans la base de données, il est tout à fait possible que votre application lève une exception à cela car l'utilisateur n'est pas authentifié pour cette opération. En utilisant try, catch et enfin, vous pouvez vous reconnecter à l'utilisateur sans que l'utilisateur ne fasse quoi que ce soit. pour plus d'informations, visitez ce

Dans le premier cas, l'utilisateur doit se reconnecter explicitement, la deuxième méthode nécessite un travail supplémentaire pour vous mais plus pratique pour l'utilisateur. Le choix vous appartient.