Fehlermeldung
jwt not active
jsonwebtoken (Node.js) — NotBeforeError from jwt.verify()
Was der Fehler bedeutet
`NotBeforeError` von jsonwebtoken: Das Token hat einen Claim `nbf` (not before), der nach der aktuellen Zeit des Prüfers liegt, daher ist das Token noch nicht gültig. Die Eigenschaft `date` des Fehlers enthält den Zeitpunkt, ab dem das Token gültig wird. Die Signatur wurde bereits geprüft und ist in Ordnung.
Warum der Fehler auftritt
Die Uhr des Prüfers geht gegenüber der des Ausstellers nach
häufigAussteller setzen `nbf` üblicherweise auf den Ausstellungszeitpunkt. Geht die Uhr des prüfenden Rechners einige Sekunden oder Minuten nach, scheitern frisch ausgestellte Tokens, bis die nachgehende Uhr aufgeholt hat – das sieht aus wie ein sporadischer Fehler direkt nach dem Login.
Das Token wurde mit einer Verzögerung per notBefore signiert
gelegentlich`jwt.sign(payload, key, { notBefore: "5m" })` stellt absichtlich ein Token aus, das erst später gültig wird. Wird es früher verwendet, ist die Ablehnung korrekt.
nbf in Millisekunden
seltenNumericDate zählt Sekunden seit der Epoche. Eine von Hand gebaute Payload mit `nbf: Date.now()` ist erst in ferner Zukunft gültig.
So behebst du den Fehler
- 1.
Kleine Uhrenabweichung zulassen
`clockTolerance` (in Sekunden) gilt sowohl für `nbf` als auch für `exp`. Halte den Wert bei höchstens einer Minute und behebe echte Drift mit NTP auf beiden Rechnern.
js jwt.verify(token, publicKey, { algorithms: ["ES256"], clockTolerance: 30, // seconds; applies to nbf and exp }); - 2.
Messen, wie früh das Token kommt
Vergleiche `err.date` mit der Uhr des Prüfers. Sekunden bedeuten Uhrenabweichung; genau die Verzögerung aus `notBefore` bedeutet, dass das Token zu früh verwendet wird; Tausende Jahre bedeuten einen Fehler mit Millisekunden.
js try { jwt.verify(token, publicKey, { algorithms: ["ES256"] }); } catch (err) { if (err.name === "NotBeforeError") { const early = (err.date.getTime() - Date.now()) / 1000; console.warn("token becomes valid in", early.toFixed(1), "s"); } throw err; }