CORS请求中 credentials 设置为 true 为啥还是报错?

Newb.俊娜 阅读 76

我在前端用 fetch 调用自己后端的登录接口,设置了 credentials: ‘include’,但浏览器一直报 CORS 错误,说不能携带凭证。后端明明加了 Access-Control-Allow-Credentials: true 啊,到底哪里不对?

我试过把 Access-Control-Allow-Origin 设成具体域名而不是 *,也确认 cookie 能正常设置,但一加上 credentials 就失败。

fetch('https://api.example.com/login', {
  method: 'POST',
  credentials: 'include',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ username: 'test', password: '123' })
})
我来解答 赞 3 收藏
二维码
手机扫码查看
1 条解答
Dev · 羽霏
这问题我遇到过,确实让人头疼。你后端的 Access-Control-Allow-Origin 设置得没错,但可能忽略了一个关键点:这个头部必须精确匹配前端请求的 Origin,而且不能用通配符 *。

简单说下原理:浏览器在处理带凭证的跨域请求时,对 CORS 的校验特别严格。哪怕后端返回了正确的 Access-Control-Allow-Credentials: true,如果 Origin 不匹配,照样报错。

建议你在后端这样处理:
const origin = req.headers.origin;
if (allowedOrigins.includes(origin)) {
res.setHeader('Access-Control-Allow-Origin', origin);
res.setHeader('Access-Control-Allow-Credentials', 'true');
}


另外记得检查 preflight 请求(OPTIONS 方法)是否正确响应这些头部,不然也会出问题。这种预检请求的结果最好缓存起来,减少服务器压力。

最后提醒一句,别忘了在生产环境设置合理的 CORS 缓存时间,不然每次都要走一遍 OPTIONS 请求,性能损失不小。
点赞
2026-03-27 17:00