问题:jsonwebtoken生成的JWT Token始终未失效,求排查
问题原因及解决方案
你的JWT Token永久有效是因为手动设置的iat值格式错误:
- 在
genJWT函数中,你用Date.now()作为iat的值,这个方法返回的是毫秒级时间戳 - 但
jsonwebtoken库默认使用秒级时间戳处理iat和exp字段,导致生成的exp(过期时间)被错误设置为毫秒级数值,相当于把过期时间延后了1000倍(1分钟变成了16.6小时),所以看起来Token永远不会失效
修复方案
有两种方式可以解决:
方案1:移除手动设置的iat参数
jsonwebtoken会自动生成正确的秒级iat值,无需手动指定:
import jwt from "jsonwebtoken"; export const genJWT = (username: string) => { const token = jwt.sign({ sub: username }, "123456qwerty", { expiresIn: "1min", algorithm: "HS256", }); return token; };
方案2:将iat转换为秒级时间戳
如果一定要手动设置iat,需要把毫秒转成秒:
import jwt from "jsonwebtoken"; export const genJWT = (username: string) => { const token = jwt.sign({ sub: username, iat: Math.floor(Date.now() / 1000) }, "123456qwerty", { expiresIn: "1min", algorithm: "HS256", }); return token; };
修复后,Token会在1分钟后正常失效,passport-jwt的验证逻辑会自动检查exp字段,无需额外修改中间件配置。
内容的提问来源于stack exchange,提问作者Jplus2
相关产品推荐
相关产品推荐

