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:
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.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 serveurLe numéro 2 est-il le moyen recommandé/attendu de gérer cela? Il semble que quelque chose ne va pas ici ...
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.
Essayez d'utiliser quelque chose de plus semblable à ceci:
Auth.auth().currentUser.getIDTokenForcingRefresh(true) { (token, err) in
/* your code to manage error and success */
}
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.