跳到主要内容
ecdsa.com
jsonwebtoken (Node.js)JWT 库

错误信息

jwt not active

jsonwebtoken (Node.js) — NotBeforeError from jwt.verify()

含义

这是 jsonwebtoken 的 `NotBeforeError`:令牌的 `nbf`(not before)声明晚于验证方的当前时间,因此令牌尚未生效。错误的 `date` 属性保存的是令牌开始生效的时刻。签名已经检查过,没有问题。

原因

修复方法

  1. 1.

    允许少量时钟偏差

    `clockTolerance`(单位为秒)同时作用于 `nbf` 和 `exp`。把它控制在一分钟以内,并在两台机器上用 NTP 解决真正的时钟漂移。

    js
    jwt.verify(token, publicKey, {
      algorithms: ["ES256"],
      clockTolerance: 30, // seconds; applies to nbf and exp
    });
  2. 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;
    }

相关错误

浏览完整的签名错误库