Перейти к содержимому
ecdsa.com
jsonwebtoken (Node.js)Библиотеки JWT

Сообщение об ошибке

jwt expired

Что это означает

TokenExpiredError из jsonwebtoken: утверждение exp токена (метка времени Unix в секундах) раньше текущего времени по часам проверяющей стороны. Сама подпись при этом может быть совершенно верной — токен просто пережил срок жизни, который задал ему издатель. В объекте ошибки есть поле expiredAt с точным моментом истечения.

Почему это происходит

Как исправить

  1. 1.

    Явно разрешите небольшое расхождение часов

    clockTolerance задаётся в секундах и действует на exp и nbf. Делайте его небольшим (30–60 с) — он нужен, чтобы компенсировать уход часов, а не чтобы продлевать срок жизни токенов.

    js
    jwt.verify(token, publicKey, {
      algorithms: ["ES256"],
      clockTolerance: 30, // seconds of tolerated skew
    });
  2. 2.

    Проверьте exp, прежде чем винить часы

    Декодируйте утверждения и выведите exp рядом с текущим временем. Если exp выглядит как 1.7e12, у вас ошибка с миллисекундами; если exp указывает на момент несколько минут назад, нужна логика обновления токена.

    js
    const { exp } = jwt.decode(token);
    console.log("exp:", new Date(exp * 1000).toISOString());
    console.log("now:", new Date().toISOString());
  3. 3.

    Синхронизируйте часы и добавьте обновление токена

    Запустите NTP (chrony/systemd-timesyncd) на хостах, которые проверяют токены, и реализуйте на стороне клиента обновление токена при ответах 401. Никогда не выкатывайте ignoreExpiration: true в рабочую среду — так каждый утёкший токен превращается в бессрочные учётные данные.

Связанные ошибки

Открыть всю базу ошибок подписей