web-dev-qa-db-fra.com

Erreur: le jeton d'ID Firebase a expiré

Je vois ces erreurs sur mon serveur lorsque j'utilise firebase admin sdk .verifyIdToken()

Le jeton ID Firebase a expiré. Obtenez un nouveau jeton depuis votre application client et réessayez.

Le jeton Firebase ID a une revendication "kid" qui ne correspond pas à une clé publique connue. Il est fort probable que le jeton d'identification a expiré. Vous devez donc vous procurer un nouveau jeton dans votre application client et réessayer. Voir https://firebase.google.com/docs/auth/admin/verify-id-tokens pour plus d'informations sur la récupération d'un jeton d'identification.

Du côté du client, je le fais avant chaque requête entre le serveur <> du navigateur:

firebase.auth().currentUser.getIdToken()

D'après ma compréhension de la lecture de la documentation, cette fonction obtiendra un jeton valide non expiré, car le SDK en arrière-plan s'actualisera lui-même si nécessaire. Je peux éventuellement passer true à cette fonction pour forcer une actualisation.

Pourquoi cette fonction getIdToken() semble-t-elle envoyer des jetons expirés à mon serveur?

Il semble que pour résoudre ce problème mes options sont les suivantes:

  1. Passez true pour forcer l'actualisation à chaque fois que j'appelle getIdToken (). Cela coûte inutilement cher, car cela ajoutera la surcharge d’une requête réseau aller-retour complète du navigateur <> firebase avant la requête du navigateur <> mon serveur.
  2. appelez getIdToken()de la façon dont je suis maintenant - décodez le jeton manuellement côté client, vérifiez l'expiration, s'il est expiré, appelez à nouveau getIdToken(true) pour forcer l'actualisation et envoyer ce nouveau jeton à mon serveur

Le numéro 2 est-il le moyen recommandé/attendu de gérer cela? Il semble que quelque chose ne va pas ici ...

14
dylanjha

Le jeton expire généralement après une heure. getIdToken actualisera le jeton mis en cache s'il a expiré. Assurez-vous de toujours appeler cela sur le client lorsque vous devez envoyer le jeton à votre serveur. Si vous mettez le jeton en cache et que vous l'envoyez toujours à votre serveur, il expirera à un moment donné.

Aussi, juste au cas où, assurez-vous que votre horloge de serveur est synchronisée. C'est peu probable mais votre horloge pourrait être désynchronisée pour une raison quelconque.

5
bojeil

Essayez d'utiliser quelque chose de plus semblable à ceci:

Auth.auth().currentUser.getIDTokenForcingRefresh(true) { (token, err) in

/* your code to manage error and success */

}
0
Stephane Paquet

Avez-vous remarqué qu'il existe un moyen asynchrone d'obtenir le jeton?

            mAuth.getCurrentUser().getIdToken(false).addOnSuccessListener(new OnSuccessListener<GetTokenResult>() {
            @Override
            public void onSuccess(GetTokenResult getTokenResult) {
                long time = System.currentTimeMillis() - starttime;

                Log.d("testt", "time " + time + ", token " + getTokenResult.getToken());
            }
        });

Pas sûr, mais j'imagine qu'il effectue une vérification interne et que le jeton n'est plus valide (par exemple, une diffusion de jeton actualisée pour l'utilisateur actuel n'a pas été transmise à l'utilisateur pour une raison quelconque, problème de réseau par exemple), il en demande un nouveau et le renvoie.

P.S. Je fais aussi une recherche sur ce sujet et le mettrai à jour si je vais trouver quelque chose de nouveau.

0
Andranik