You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jsonwebtoken@8.2.0设置30天过期JWT次日失效求助

排查JWT次日失效问题的关键要点

嘿,我来帮你梳理几个最可能导致这个问题的原因和解决办法:

1. 先检查expiresIn的拼写!

你提到代码里写了expiredIn: '30d'——这很可能是问题根源!jsonwebtoken库的正确参数名是**expiresIn**(少了一个d)。如果参数名写错,这个30天的过期配置根本不会生效,token会用默认的过期规则(可能很短,甚至服务器端会强制设置短有效期),自然第二天就失效了。

赶紧把参数名改过来:

// 正确写法
jwt.sign(你的payload, 密钥, { expiresIn: '30d' });

2. 确认前端取token的方式对不对

你说localStorage里存的是{ token: "长字符串..." }的JSON格式,那你请求服务器时,是不是直接把这个JSON字符串传过去了?比如存的时候用了JSON.stringify(),取的时候必须先JSON.parse()拿到里面的token字段值,再放到请求头里(比如Authorization: Bearer <真实token>)。

举个错误和正确的例子:

// ❌ 错误:直接拿整个JSON字符串
const token = localStorage.getItem('authData');
// 此时token是"{"token":"xxx"}",不是真正的JWT

// ✅ 正确:解析后取token字段
const storedAuth = JSON.parse(localStorage.getItem('authData'));
const token = storedAuth?.token;
// 然后在请求头里设置
axios.get('/api/data', {
  headers: { 'Authorization': `Bearer ${token}` }
});

3. 排查服务器端的验证逻辑

就算前端token看起来没问题,服务器端也可能出状况:

  • 确保服务器用的密钥和生成token时的密钥完全一致(大小写、特殊字符都不能错),密钥变了的话旧token肯定验证失败。
  • 看看服务器端有没有额外的过期时间限制,比如某些框架或中间件会覆盖JWT的exp字段设置。
  • 去服务器日志里找错误信息,JWT验证失败通常会有明确提示(比如TokenExpiredError或者JsonWebTokenError),根据日志定位问题最快。

4. 检查服务器和客户端的时间差

如果服务器的系统时间比你的客户端快很多(比如快了好几天),那就算你设置了30天过期,服务器也会认为token已经过期。对比一下两边的时间,确保同步。

5. 验证token的实际过期时间

你可以用Node.js代码解析一下localStorage里的token,看看exp字段对应的时间是不是真的30天后:

const jwt = require('jsonwebtoken');
const yourToken = '从localStorage里复制的token字符串';
const decoded = jwt.decode(yourToken);
// 把时间戳转成日期
console.log('token过期时间:', new Date(decoded.exp * 1000));

如果这个日期不是当前时间加30天,那肯定是生成token时的过期配置没生效,回到第一个问题再检查参数名。

内容的提问来源于stack exchange,提问作者Xingsong Lin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:47:20