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

如何解决TokenExpiredError: jwt expired?省略expiresIn是否安全?

问题解决:JWT TokenExpiredError 处理方案

问题根源

你遇到的TokenExpiredError就是因为代码里生成的access token设置了7天有效期,当令牌过期后,前端仍在使用过期令牌发起请求,服务器验证失败抛出该错误。你删除浏览器缓存(或用无痕模式)能恢复,是因为清除了过期的token,重新登录会生成新的有效令牌,但这是治标不治本的方式。


核心问题:省略expiresIn让令牌永不过期是否安全?

绝对不安全,这是严重的安全漏洞:

  • 一旦令牌被攻击者窃取(比如通过XSS攻击、网络嗅探),攻击者可以永久使用该令牌冒充用户身份,你无法单方面失效这个令牌,除非更换全局的API_SECRET,但这会导致所有合法用户的令牌全部失效,代价极大。
  • expiresIn是JWT安全机制的核心部分,用来限制令牌的滥用窗口,是行业通用的安全最佳实践,绝对不能省略。

正确的解决办法

1. 完善Refresh Token自动刷新流程

你的代码已经生成了有效期30天的refresh token,但没有利用它实现自动刷新逻辑,这是最关键的修复点:

  • 登录时:后端同时返回access token(7天)和refresh token(30天),建议把refresh token存储在HttpOnly、Secure的Cookie中(避免前端JS读取,降低XSS风险)。
  • 前端请求逻辑:日常接口用access token授权,当收到服务器返回的TokenExpiredError(HTTP 401状态码),前端携带refresh token调用专门的刷新接口。
  • 后端刷新接口实现:
    static async refreshAccessToken(req, res) {
      const { refreshToken } = req.cookies; // 从Cookie获取refresh token
      if (!refreshToken) {
        return res.status(401).json({ message: '需要重新登录' });
      }
    
      try {
        // 验证refresh token的有效性
        const payload = jwt.verify(refreshToken, API_SECRET_REFRESH);
        // 生成新的access token
        const newAccessToken = this.generateToken(payload.username, payload.type, payload.id);
        return res.json({ accessToken: newAccessToken });
      } catch (err) {
        // refresh token也过期或无效,引导用户重新登录
        return res.status(401).json({ message: '登录已过期,请重新登录' });
      }
    }
    
  • 前端拿到新的access token后,替换旧令牌,继续正常请求,用户完全无感知。

2. 前端主动预判令牌过期

前端可以提前解析access token的exp字段,在令牌即将过期前(比如提前5分钟)主动发起刷新请求,避免等到服务器报错再处理:

import jwtDecode from 'jwt-decode';

const checkTokenExpiry = (accessToken) => {
  const decoded = jwtDecode(accessToken);
  const expiresAt = decoded.exp * 1000;
  // 提前5分钟刷新
  const refreshThreshold = 5 * 60 * 1000;
  if (Date.now() >= expiresAt - refreshThreshold) {
    // 调用刷新接口获取新token
  }
};

3. 优化错误提示与处理

后端捕获TokenExpiredError时,返回明确的HTTP 401状态码和提示信息,前端收到后:

  • 如果refresh token有效,自动触发刷新流程;
  • 如果refresh token也过期,弹出友好提示引导用户重新登录,而不是让用户自行清理缓存。

内容的提问来源于stack exchange,提问作者Daniel Corona

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 15:06:16