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
相关产品推荐
相关产品推荐

