Node.js后端CORS配置报错:预检响应不允许Authorization请求头
问题原因
- 后端CORS配置的
Access-Control-Allow-Headers字段未包含Authorization请求头:当前后端只允许了Origin, X-Requested-With, Content-Type, Accept四个头,而前端请求携带了Authorization头用于身份认证,浏览器预检请求校验不通过直接抛出错误。 - 前端配置错误:
Access-Control-Allow-Origin、Access-Control-Allow-Headers、Access-Control-Allow-Credentials均属于响应头,需要由后端返回给浏览器,前端在请求头中配置这些字段完全无效,反而会被当做自定义请求头触发额外的预检校验。 - 配置存在互斥项:同时使用了
Access-Control-Allow-Origin: *和Access-Control-Allow-Credentials: true,这两个配置是互斥的,浏览器不允许在允许携带凭证的场景下将允许源设为通配符*,如果业务需要携带Cookie或者Authorization凭证,必须将Access-Control-Allow-Origin的值设置为前端的具体域名。 - 昨日正常今日报错的常见原因:大概率是此前的请求未携带
Authorization头(比如之前未上线登录逻辑、token校验逻辑今日才启用),或者近期修改过后端CORS配置、前端请求逻辑,未同步调整CORS规则。
修复方案
- 第一步:修改后端CORS配置,增加
Authorization到允许的请求头列表,同时补充OPTIONS请求的处理,以及凭证相关配置:
app.use(function (req, res, next) { // 替换为你的前端实际域名,需要带凭证时不能用*通配符 res.header("Access-Control-Allow-Origin", "https://example.com") // 增加Authorization到允许的请求头列表 res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization") // 允许携带凭证 res.header("Access-Control-Allow-Credentials", "true") // 直接处理预检OPTIONS请求返回200 if (req.method === 'OPTIONS') { return res.sendStatus(200) } next() })
- 第二步:删除前端Axios配置里所有
Access-Control-开头的请求头,同时修正GET请求的参数传递方式(GET请求不规范携带body,部分浏览器会直接忽略),修改后的请求代码如下:
Axios({ method: "GET", url: `${REACT_APP_API_BASE_URL}/${endpoint}`, // GET请求用params传递参数,POST请求再用data params: body, headers: { Authorization: `Bearer ${token}` }, // 如果需要携带Cookie可开启该配置,仅传递Authorization的话可以省略 withCredentials: true });
内容的提问来源于stack exchange,提问作者Kien Pham
相关产品推荐
相关产品推荐

