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

Node.js无法从req.headers.authorization提取JWT token问题求助

问题解决步骤

你遇到的核心问题是前端请求没有主动携带Authorization头,同时存在几处代码逻辑不匹配的问题,按以下步骤修改即可:

1. 前端登录成功后存储token

你当前的登录逻辑没有接收接口返回的token,也没有做本地存储,修改login函数:

const login = async (e) => {
  e.preventDefault();
  // 接收登录接口返回的响应数据
  const res = await POST(ENDPOINTS.USER_LOGIN, userLogin);
  // 将token存储到localStorage(也可以用sessionStorage)
  localStorage.setItem('jwt_token', res.token);
};

2. 给请求统一添加Authorization头

你封装的POST方法目前没有携带认证头,有两种实现方式:

  • 方式一:给请求工具加全局拦截器(以axios为例,如果你是自己封装的fetch逻辑同理)
// 请求拦截器,所有请求发出去前自动加头
axios.interceptors.request.use(config => {
  const token = localStorage.getItem('jwt_token');
  if (token) {
    // 注意Bearer后面有空格
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
});
  • 方式二:发需要鉴权的请求时手动传头
// 调用POST时传入headers参数
await POST(ENDPOINTS.PROTECTED_API, data, {
  headers: {
    Authorization: `Bearer ${localStorage.getItem('jwt_token')}`
  }
});

3. 修复后端两处逻辑错误

你当前的鉴权中间件存在两个会导致验证失败的问题:

3.1 兼容空Authorization头的情况,同时修正JWT payload字段不匹配的问题

module.exports = (req, res, next) => {
  try {
    // 先判断Authorization头是否存在
    const authHeader = req.headers.authorization;
    if (!authHeader || !authHeader.startsWith('Bearer ')) {
      return res.status(401).json({ error: "缺少有效认证头" });
    }
    const token = authHeader.split(" ")[1];
    // 注意:你签发JWT时payload的键是userId,不是user_id
    const decodedToken = jwt.verify(token, process.env.JWT_TOKEN);
    const userId = decodedToken.userId;
    if (req.body.user_id && req.body.user_id !== userId) {
      throw "用户ID无效";
    } else {
      next();
    }
  } catch {
    res.status(401).json({
      error: new Error("用户ID无效"),
    });
  }
};

3.2 统一JWT签名密钥

你当前签发JWT时用的是硬编码的"TOOOKEN",但验证时用的是process.env.JWT_TOKEN,需要保持两者一致,建议都用环境变量:

// 登录接口签发token的部分修改为
token: jwt.sign({ userId: user_id }, process.env.JWT_TOKEN, {
  expiresIn: "24h",
})

4. 配置跨域允许Authorization头

你是跨域请求(前端端口3000,后端端口4200),需要在后端配置CORS规则,允许Authorization头透传,以express的cors中间件为例:

const cors = require('cors');
app.use(cors({
  origin: 'http://localhost:3000',
  // 允许前端携带Authorization头
  allowedHeaders: ['Content-Type', 'Authorization']
}));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:21:02