node -e "console.log(Date.now(), Math.floor(Date.now()/1000))"
python -c "import base64,json; p='eyJleHAiOjE3NzAwMDAwMDAwMDB9'; print(json.loads(base64.urlsafe_b64decode(p+'==')))"

登录后拿到的 token 调任何接口都返回 401,payload 里 exp 是 1770000000000,解码出来对应五万多年以后,校验库却判定已过期。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,JWT 规范里 exp 和 iat 都是秒级时间戳,库直接拿它和当前秒数比较。毫秒值比当前秒数大三个数量级,有的库因为超出范围抛异常,有的直接判成无效。

「JWT exp 单位」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

处理上按这个顺序:签发时统一用 Math.floor(Date.now()/1000);payload 里同时写 iat 方便排查;把解码后的 exp 打印出来和当前时间对比;换库或升级时用同一份 token 回归一次。

改完只确认一件事:重新签发后 exp 是十位数字 接口返回 200 解码显示还有两小时有效期。

作者 9823189