Message d’erreur
The token is not yet valid (iat)
Également affiché sous la forme
- The token is not yet valid (nbf)
- jwt.exceptions.ImmatureSignatureError: The token is not yet valid (iat)
Le claim entre parenthèses est `iat` ou `nbf`. Les versions 2.0 à 2.5 de PyJWT acceptaient un `iat` dans le futur ; la version 2.6.0 a commencé à le rejeter, si bien qu’une mise à jour depuis une ancienne version peut révéler un décalage d’horloge qui existait depuis toujours.
PyJWT (Python) — jwt.exceptions.ImmatureSignatureError
Ce que cela signifie
`ImmatureSignatureError` de PyJWT : le claim `iat` (date d’émission) ou `nbf` (pas avant) du jeton est postérieur à l’heure actuelle du vérificateur. Le nom entre parenthèses indique de quel claim il s’agit. PyJWT rejette les jetons émis « dans le futur », car un émetteur correct ne peut pas en produire ; en pratique, cela signifie presque toujours que l’horloge de l’émetteur est en avance sur la vôtre.
Pourquoi cela se produit
L’horloge de l’émetteur est en avance
fréquenteLes jetons émis sur un hôte dont l’horloge avance de quelques secondes échouent sur tout vérificateur à l’horloge correcte jusqu’à ce que ces secondes soient écoulées. Le problème paraît intermittent, car la plupart des requêtes arrivent après que cet écart s’est écoulé.
L’émetteur a défini un nbf dans le futur
occasionnelleLes jetons qui deviennent valides plus tard (accès programmé, activation différée) sont rejetés jusqu’à `nbf`. C’est le comportement prévu.
Horodatages en millisecondes
rareLes dates JWT s’expriment en secondes. Un émetteur qui écrit `time.time() * 1000` ou le `Date.now()` de JavaScript produit des jetons qui ne seront valides que dans plusieurs dizaines de milliers d’années.
Comment corriger l’erreur
- 1.
Accorder une faible tolérance
`leeway` (en secondes ou sous forme de `timedelta`) tolère les écarts d’horloge pour `exp`, `nbf` et `iat`. Limitez-le à quelques dizaines de secondes, et corrigez avec NTP l’horloge qui dérive.
python from datetime import timedelta claims = jwt.decode( token, signing_key, algorithms=["ES256"], audience="https://api.example.com", leeway=timedelta(seconds=30), # applies to exp, nbf and iat ) - 2.
Mesurer le décalage
Affichez chaque claim de date par rapport à l’horloge locale. Une petite avance de `iat` indique un décalage d’horloge ; une avance énorme indique un bug d’unité chez l’émetteur.
python import time c = jwt.decode(token, options={"verify_signature": False}) now = int(time.time()) print({k: c[k] - now for k in ("iat", "nbf", "exp") if k in c}) # seconds relative to this host