← 中文资源

简体中文版本

JWT 即便刚登录也报 token expired

通过检查 exp 声明、时钟偏差与刷新时机,诊断 JWT 的过期错误。

阅读英文原文

症状

请求以 TokenExpiredError 失败,尽管用户刚登录。解码 token 可见其 exp 声明,问题在于究竟是 token 真的过期,还是验证方因自身时钟领先签发方而如此认为。极短 TTL 与服务间时钟偏差叠加会让有效 token 看似过期,容易误判为登录缺陷。

诊断

不校验地解码 iat/exp;对比服务器时钟;允许小的时间容差。

node -e "console.log(JSON.parse(Buffer.from(process.argv[1].split('.')[1], 'base64'))" <token>

根因

验证方认为 token 已过期,因为其 exp 声明在过去——或确因 TTL 过短,或表面因验证方时钟领先签发方。

修复

按用例设置 TTL;在服务间同步时钟;允许小的时钟容差;依据剩余寿命主动刷新而非在请求失败后才刷新,以避免错误窗口。

验证

登录后在预期寿命内使用 token 确认被接受,并确认正常流量下刷新发生在过期之前。寿命内可用且主动刷新即证明修复。

常见陷阱

为消除过期错误而大幅延长 TTL 会扩大泄露 token 的利用窗口;应在安全与体验间权衡。