Message d’erreur
"exp" claim timestamp check failed
jose (JavaScript) — JWTExpired, code ERR_JWT_EXPIRED
Ce que cela signifie
La validation des claims de jose a rejeté le jeton parce que son horodatage exp est dans le passé par rapport à l’horloge du vérificateur. La vérification de la signature avait déjà réussi : il s’agit uniquement d’un défaut de fraîcheur. jose emploie la même formulation pour d’autres claims (« "nbf" claim timestamp check failed ») lorsqu’un jeton est utilisé avant son début de validité.
Pourquoi cela se produit
Le jeton a dépassé sa durée de vie
fréquenteLes jetons d’accès sont conçus pour avoir une durée de vie courte. Un client qui met des jetons en cache sans vérifier leur expiration, un consommateur de file qui traite un message contenant un jeton des heures après sa mise en file, ou une fixture de test avec un jeton codé en dur aboutissent tous immanquablement à cette erreur.
Horloge du vérificateur en avance sur celle de l’émetteur
fréquenteQuelques minutes de dérive d’horloge sur l’hôte qui vérifie raccourcissent la durée de vie effective de chaque jeton et peuvent faire rejeter des jetons tout juste émis. Les conteneurs héritent de l’horloge de leur hôte : une VM dont l’horloge dérive casse d’un coup tous les pods qu’elle héberge.
Mauvaise unité écrite dans exp
occasionnelleexp doit être un nombre de secondes depuis l’epoch (RFC 7519). Un code d’émission qui divise mal ou qui transmet un objet Date sérialisé en millisecondes produit des jetons soit expirés dès leur création, soit valides pendant des millénaires.
Comment corriger l’erreur
- 1.
Ajouter une tolérance d’horloge bornée
jose accepte une option clockTolerance (un nombre de secondes ou une chaîne lisible par un humain). Gardez-la faible : elle sert à absorber la dérive, pas à prolonger la durée de vie.
js import { jwtVerify } from "jose"; await jwtVerify(token, key, { algorithms: ["ES256"], clockTolerance: "30s", }); - 2.
Afficher la chronologie avant de modifier quoi que ce soit
Comparez iat, exp et l’instant présent du vérificateur. Le schéma vous indique la cause : exp déjà passé de plusieurs secondes → problème d’actualisation ; exp avant iat → bogue d’émission ; exp ≈ maintenant mais échec → décalage d’horloge.
js import { decodeJwt } from "jose"; const { iat, exp } = decodeJwt(token); console.log({ iat: new Date(iat * 1000), exp: new Date(exp * 1000), now: new Date() });