Node.js+Express中间件无法获取JWT Token及签名无效问题求助
问题修复方案
问题1:中间件无法获取JWT Token,req.headers.authorization始终为undefined
核心错误点
- 变量名冲突:你在中间件中使用
const res = req.headers.authorization;,这里的res覆盖了Express自带的响应对象,导致后续逻辑异常,且无法正确获取请求头。 - 拼写错误:
token.lenght应为token.length,拼写错误会导致授权逻辑判断失效。 - 未处理空值场景:未对
authorization头为空的情况做容错处理,直接调用split会抛出错误。
修复后的middleware.js代码
import jwt from "jsonwebtoken"; const authMiddleware = async (req, res, next) => { try { // 修改变量名,避免覆盖响应对象 const authHeader = req.headers.authorization; // 容错处理:如果没有Authorization头,直接返回未授权 if (!authHeader) { return res.status(401).json({ message: "未提供授权Token" }); } // 提取Bearer后的Token部分 const token = authHeader.split(" ")[1]; // 修正拼写错误:lenght → length const isCustomAuth = token.length < 500; let decodedData; if (token && isCustomAuth) { decodedData = jwt.verify(token, "test"); req.userId = decodedData.id; } else { decodedData = jwt.decode(token); req.userId = decodedData.sub; } next(); } catch (error) { console.log(error); return res.status(401).json({ message: "Token验证失败" }); } }; export default authMiddleware;
额外检查项
- 前端请求格式:确保请求头严格遵循
Bearer <Token>格式,示例:// Axios请求示例 axios.get('/api/protected', { headers: { Authorization: `Bearer ${yourToken}` } }) - 跨域配置:如果是跨域项目,需在Express中配置CORS允许自定义头:
import cors from 'cors'; app.use(cors({ origin: '你的前端域名', credentials: true, allowedHeaders: ['Authorization', 'Content-Type'] }));
问题2:JWT在线解码提示"Invalid Signature"但能解析内容
原因说明
JWT分为Header、Payload、Signature三部分:
- Payload是Base64编码的明文,不需要密钥就能解码查看内容;
- Signature是用密钥和算法生成的验证串,只有密钥与生成时完全匹配,验证才会通过。
解决步骤
- 你生成Token时使用的密钥是
"test",算法默认是HS256,在在线工具验证时:- 确保在"Verify Signature"输入框中填入密钥
"test" - 确认算法选择为
HS256(工具默认可能匹配,但需手动核对)
- 确保在"Verify Signature"输入框中填入密钥
- 代码中生成和验证Token的密钥一致(均为
"test"),这部分逻辑正确,无需修改。
额外代码优化(非核心问题)
userController.js中有拼写错误:hashedPasswoed → hashedPassword,建议修正以避免后续混淆:
const hashedPassword = await bcrypt.hash(password, 12);
内容的提问来源于stack exchange,提问作者Lakshan
相关产品推荐
相关产品推荐

