跳到主要内容
ecdsa.com
jose (JavaScript)JWT 库

错误信息

"exp" claim timestamp check failed

jose (JavaScript) — JWTExpired, code ERR_JWT_EXPIRED

含义

jose 的声明校验拒绝了这个令牌,因为按验证方的时钟,令牌的 exp 时间戳已经过去。签名检查此前已经通过——这纯粹是时效性检查失败。对于其他声明,jose 也使用同样的措辞模式:如果令牌在其 not-before 时间之前就被使用,会报告“"nbf" claim timestamp check failed”。

原因

修复方法

  1. 1.

    添加有上限的时钟容差

    jose 接受 clockTolerance 选项(秒数或人类可读的字符串)。把它设得小一些;它用来吸收时钟漂移,而不是用来延长有效期。

    js
    import { jwtVerify } from "jose";
    
    await jwtVerify(token, key, {
      algorithms: ["ES256"],
      clockTolerance: "30s",
    });
  2. 2.

    改动任何设置之前,先打印时间线

    比较 iat、exp 和验证方的当前时间。规律会告诉你原因:exp 已过去若干秒 → 刷新有问题;exp 早于 iat → 签发逻辑出错;exp ≈ 当前时间却仍失败 → 时钟偏差。

    js
    import { decodeJwt } from "jose";
    
    const { iat, exp } = decodeJwt(token);
    console.log({ iat: new Date(iat * 1000), exp: new Date(exp * 1000), now: new Date() });

相关错误

浏览完整的签名错误库