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

Node.js Express全局中间件无法获取Authorization请求头问题

问题原因与解决办法

核心问题出在两点:CORS配置缺失 + OPTIONS请求处理逻辑错误

1. CORS未授权Authorization头

跨域场景下,浏览器发送带Authorization头的请求前,会先发送OPTIONS预检请求,询问服务器是否允许这个自定义头。如果服务器的CORS响应里没有Access-Control-Allow-Headers: Authorization,浏览器会直接拦截后续实际请求的Authorization头,导致后端拿不到req.headers.authorization——这就是你看到access-control-request-headers里有authorization,但实际请求头不存在的原因。之前单端点配置时可能附带了CORS处理,全局迁移后没跟上。

2. OPTIONS请求的逻辑篡改了请求方法

你的unless函数把OPTIONS请求的reqMethod替换成了access-control-request-method,但如果publicPaths里没匹配到这个转换后的方法,OPTIONS请求会触发鉴权中间件。但OPTIONS请求本身不会携带Authorization头,会直接触发鉴权失败,进而让浏览器终止后续实际请求。


解决步骤

第一步:补全CORS配置,允许Authorization头

优先使用官方cors中间件,或者手动配置,注意要把CORS放在所有路由、鉴权中间件之前:

// 用cors中间件的方式(推荐)
const cors = require('cors');
app.use(cors({
  origin: '你的前端域名', // 生产环境别用true,指定具体域名
  allowedHeaders: ['Authorization', 'Content-Type'],
  methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']
}));

// 手动配置的方式
app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '你的前端域名');
  res.header('Access-Control-Allow-Headers', 'Authorization, Content-Type');
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
  // OPTIONS预检请求直接返回200,不用走后续逻辑
  if (req.method === 'OPTIONS') {
    return res.sendStatus(200);
  }
  next();
});

第二步:修复unless函数的OPTIONS处理逻辑

别篡改OPTIONS的请求方法,直接放行所有OPTIONS请求——因为它只是预检,不需要鉴权:

const unless = function(path, middleware) {
  return function(req, res, next) {
    // 所有OPTIONS请求直接放行,不参与鉴权判断
    if (req.method === 'OPTIONS') {
      return next();
    }
    const reqMethod = req.method;
    // 匹配公开路由规则
    const isPublic = path.find(({url, method, methods}) => {
      return url === req.path && (method === reqMethod || methods === reqMethod);
    });
    isPublic ? next() : middleware(req, res, next);
  };
};

第三步:检查publicPaths的格式一致性

确保数组里的对象key统一,别混用method和methods,比如:

const publicPaths = [
  { url: '/api/login', method: 'POST' },
  { url: '/api/register', method: 'GET' }
];

验证

重启服务后,用浏览器开发者工具查看Network面板,确认实际请求的Request Headers里存在Authorization,后端req.headers.authorization就能正常拿到值了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:06:00