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

Node.js+Express中间件无法获取JWT Token及签名无效问题求助

问题修复方案

问题1:中间件无法获取JWT Token,req.headers.authorization始终为undefined

核心错误点

  1. 变量名冲突:你在中间件中使用const res = req.headers.authorization;,这里的res覆盖了Express自带的响应对象,导致后续逻辑异常,且无法正确获取请求头。
  2. 拼写错误:token.lenght应为token.length,拼写错误会导致授权逻辑判断失效。
  3. 未处理空值场景:未对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是用密钥和算法生成的验证串,只有密钥与生成时完全匹配,验证才会通过。

解决步骤

  1. 你生成Token时使用的密钥是"test",算法默认是HS256,在在线工具验证时:
    • 确保在"Verify Signature"输入框中填入密钥"test"
    • 确认算法选择为HS256(工具默认可能匹配,但需手动核对)
  2. 代码中生成和验证Token的密钥一致(均为"test"),这部分逻辑正确,无需修改。

额外代码优化(非核心问题)

userController.js中有拼写错误:hashedPasswoed → hashedPassword,建议修正以避免后续混淆:

const hashedPassword = await bcrypt.hash(password, 12);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:36:26