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

React中使用Fetch传递JWT时Authorization头丢失问题求助

解决JWT认证中间件无法读取Authorization头的问题

核心问题排查方向及解决方案

1. 跨域(CORS)配置未允许自定义Authorization头

跨域请求中,浏览器会对包含自定义头的请求发送OPTIONS预检请求,如果后端未配置允许Authorization头,浏览器会过滤该头,导致中间件无法读取。

解决步骤:

  • 使用cors包时,明确配置允许的请求头:
    const cors = require('cors');
    app.use(cors({
      origin: 'http://localhost:3000', // 替换为你的前端地址
      allowedHeaders: ['Content-Type', 'Authorization'], // 必须包含Authorization
      credentials: true
    }));
    
  • 确保CORS中间件优先于所有路由和认证中间件加载,否则跨域头处理不及时会导致头丢失。

2. 认证中间件挂载顺序错误

如果认证中间件在CORS中间件之前加载,跨域请求的自定义头会被Node.js默认HTTP服务器过滤,导致中间件无法读取。

正确顺序示例:

// 1. 先处理CORS
app.use(cors(...));
// 2. 解析JSON请求体
app.use(express.json());
// 3. 再挂载认证中间件和受保护路由
app.use('/api/protected', authMiddleware, protectedRoutes);

3. 前端模板字符串语法错误(确认项)

你的前端代码中Authorization头使用了双引号,模板变量${token}不会被解析,需改为反引号:

'Authorization': `Bearer ${token}`, // 使用反引号包裹模板字符串

(注:你提到Network面板显示头存在,可能已修正,但仍建议确认)

4. 手动处理OPTIONS预检请求(未使用cors包时)

若未使用cors包,需手动响应OPTIONS请求并设置正确的头:

app.options('*', (req, res) => {
  res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  res.sendStatus(200);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:46:02