jsonwebtoken.sign() 使用对象字面量时 expiresIn 配置不生效问题
问题根因
- jsonwebtoken 库对 JWT 标准中的时间声明(iat、exp 等)默认使用秒级 Unix 时间戳处理,
expiresIn配置的单位也为秒。 - 当你手动传入
iat字段时,库不会自动校验时间单位,会直接用你传入的iat值加上expiresIn的数值计算exp。 - 你代码中
iat赋值为Date.now(),该接口返回的是毫秒级时间戳,最终计算出的exp与iat的差值仅为 43200 毫秒(即 43.2 秒),和你观测到的“差值仅几秒到几分钟”的现象完全匹配。
解决方案
两种方案二选一即可:
- 直接删除代码中手动传入的
iat字段,jsonwebtoken 会自动生成符合标准的秒级iat,并正确按照你配置的 12 小时计算有效期。 - 如果你有自定义
iat的需求,将传入值改为秒级即可:
iat: Math.floor(Date.now() / 1000)
额外注意
你使用 Dayjs 做时间展示时,需要注意将解析 JWT 拿到的秒级时间戳乘以 1000 转为毫秒后再传入 Dayjs 构造函数,避免出现时间展示错误。
内容的提问来源于stack exchange,提问作者Christian Hernandez
相关产品推荐
相关产品推荐

