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

JS中JWT令牌过期后仍验证有效,如何调整?

解决JWT过期后仍显示有效的问题

以下是针对该问题的排查和修复步骤:

1. 确保密钥完全一致

创建令牌时使用的chave和验证时的chaveSecreta必须是完全相同的字符串,包括大小写、特殊字符、空格等任何细节。可以在两处代码中分别打印密钥内容,确认一致性:

// 创建令牌时打印
console.log('创建密钥:', chave);
// 验证时打印
console.log('验证密钥:', chaveSecreta);

2. 正确处理Authorization请求头

前端传递JWT通常会使用Bearer <token>的格式(例如Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...),直接传递完整的authorization头内容会导致验证异常。需要提取纯令牌部分:

function verificarToken(req, res, next) {
  const authHeader = req.headers.authorization; 

  if (!authHeader) {
      return res.status(401).json({ message: 'Token não fornecido' });
  }

  // 分离Bearer前缀与令牌内容
  const token = authHeader.split(' ')[1];
  if (!token) {
      return res.status(401).json({ message: 'Formato de token inválido' });
  }

  jwt.verify(token, chaveSecreta, (err, decoded) => {
      if (err) {
          // 打印具体错误类型,精准定位问题
          console.log(err.name, err.message);
          if (err.name === 'TokenExpiredError') {
              return res.status(401).json({ message: 'Token expirado' });
          } else {
              return res.status(401).json({ message: 'Token inválido' });
          }
      } else {
          req.decoded = decoded;
          next();
      }
  });
}

3. 检查服务器时间同步

JWT的过期验证依赖服务器系统时间,如果服务器时间与实际时间偏差较大(例如服务器时间滞后),会导致过期令牌被误判为有效。可以在验证时打印解码后的过期时间,确认是否符合预期:

jwt.verify(token, chaveSecreta, (err, decoded) => {
    if (!err) {
        // 转换为本地时间打印
        console.log('Token过期时间:', new Date(decoded.exp * 1000));
        req.decoded = decoded;
        next();
    }
});

若服务器时间不准确,需同步到标准时区时间。

4. 确认令牌创建逻辑的正确性

可以手动指定过期时间戳测试,排除expiresIn参数解析异常的可能:

// 手动设置15秒后过期
const expiresAt = Math.floor(Date.now() / 1000) + 15;
const token = jwt.sign({ usernameCredential, exp: expiresAt }, chave);

内容的提问来源于stack exchange,提问作者Luis Antonio Marcelino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:41:23