症状
请求以 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 的利用窗口;应在安全与体验间权衡。