Fehlermeldung
The token is not yet valid (iat)
Auch ausgegeben als
- The token is not yet valid (nbf)
- jwt.exceptions.ImmatureSignatureError: The token is not yet valid (iat)
Der Claim in Klammern ist `iat` oder `nbf`. PyJWT 2.0–2.5 akzeptierte ein `iat` in der Zukunft; seit 2.6.0 wird es abgelehnt, sodass ein Upgrade von einer alten Version eine Uhrenabweichung zutage fördern kann, die schon die ganze Zeit bestand.
PyJWT (Python) — jwt.exceptions.ImmatureSignatureError
Was der Fehler bedeutet
`ImmatureSignatureError` von PyJWT: `iat` (ausgestellt am) oder `nbf` (nicht vor) des Tokens liegt nach der aktuellen Zeit der prüfenden Seite. Der Name in Klammern verrät, um welchen Claim es geht. PyJWT lehnt Tokens ab, die „in der Zukunft“ ausgestellt wurden, weil ein korrekt arbeitender Aussteller kein solches Token erzeugen kann; in der Praxis heißt das fast immer, dass die Uhr des Ausstellers gegenüber deiner vorgeht.
Warum der Fehler auftritt
Die Uhr des Ausstellers geht vor
häufigTokens, die auf einem Host erzeugt werden, dessen Uhr ein paar Sekunden vorgeht, scheitern bei jedem Prüfer mit korrekter Uhr, bis genau diese Sekunden vergangen sind. Das wirkt sporadisch, weil die meisten Anfragen erst ankommen, wenn die Abweichung schon verstrichen ist.
Der Aussteller hat ein nbf in der Zukunft gesetzt
gelegentlichTokens, die erst später gültig werden (geplanter Zugriff, verzögerte Aktivierung), werden bis `nbf` abgelehnt. Das ist das beabsichtigte Verhalten.
Zeitstempel in Millisekunden
seltenZeitangaben in JWTs sind Sekunden. Ein Aussteller, der `time.time() * 1000` oder `Date.now()` aus JavaScript schreibt, erzeugt Tokens, die erst in Zehntausenden von Jahren gültig werden.
So behebst du den Fehler
- 1.
Kleine Toleranz zulassen
`leeway` (Sekunden oder ein `timedelta`) toleriert Uhrenabweichungen bei `exp`, `nbf` und `iat`. Bleib bei einigen Dutzend Sekunden und korrigiere die abweichende Uhr per NTP.
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.
Abweichung messen
Gib jeden Zeit-Claim relativ zur lokalen Uhr aus. Ein kleiner positiver Wert bei `iat` bedeutet eine Uhrenabweichung, ein riesiger einen Einheitenfehler beim Aussteller.
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