Сообщение об ошибке
jwt not active
jsonwebtoken (Node.js) — NotBeforeError from jwt.verify()
Что это означает
`NotBeforeError` из jsonwebtoken: в токене есть утверждение `nbf` (not before, «не ранее»), и оно позже текущего времени проверяющей стороны, поэтому токен ещё не действителен. Свойство ошибки `date` содержит момент, когда токен станет действительным. Подпись уже проверена и верна.
Почему это происходит
Часы проверяющей стороны отстают от часов издателя
частоИздатели обычно задают `nbf` равным времени выдачи. Если часы проверяющей машины отстают на несколько секунд или минут, только что выпущенные токены не проходят проверку, пока отстающие часы не догонят время издателя, и это выглядит как периодический сбой сразу после входа.
Токен подписан с задержкой notBefore
иногда`jwt.sign(payload, key, { notBefore: "5m" })` намеренно выпускает токен, который станет действительным позже. Отказ при попытке использовать его раньше — правильное поведение.
nbf в миллисекундах
редкоNumericDate — это секунды с начала эпохи. Собранная вручную полезная нагрузка с `nbf: Date.now()` станет действительной только в далёком будущем.
Как исправить
- 1.
Задайте небольшой допуск на расхождение часов
`clockTolerance` (в секундах) применяется и к `nbf`, и к `exp`. Ограничьте его минутой или меньше, а настоящий уход часов устраняйте с помощью NTP на обеих машинах.
js jwt.verify(token, publicKey, { algorithms: ["ES256"], clockTolerance: 30, // seconds; applies to nbf and exp }); - 2.
Измерьте, насколько рано пришёл токен
Сравните `err.date` с часами проверяющей стороны. Разница в секунды означает расхождение часов; разница, равная задержке `notBefore`, означает, что токен используют слишком рано; разница в тысячи лет — ошибку с миллисекундами.
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; }