如何通过 CORS 传递 cookie?

Posted

技术标签:

【中文标题】如何通过 CORS 传递 cookie?【英文标题】:How to pass cookies through CORS? 【发布时间】:2019-02-08 00:44:50 【问题描述】:

我有一个项目使用 Axios 从客户端发送 HTTP 请求

axios.create(
    baseURL: `http://localhost:8081/`,
    withCredentials: true
  )

我想这允许 cookie(我确信它会在您请求之前显示在浏览器中)与请求一起发送。

问题出现在后端,当日志显示此错误时:

对预检请求的响应未通过访问控制检查: 响应中“Access-Control-Allow-Origin”标头的值必须 当请求的凭据模式为时,不是通配符“*” '包括'。因此不允许使用原点“http://localhost:8080” 使用权。发起请求的凭证模式 XMLHttpRequest 由 withCredentials 属性控制。

我试过了:

app.use(cors(
  //origin : to be set later
  credentials: true,
))

改为:

app.use(function(req, res, next) 
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
  res.header("Access-Control-Allow-Credentials", true);
  next();
);

但似乎都不起作用。

编辑 - 这是未来访问者的答案

在 cmets 参与者的帮助下,我发现我必须设置原点值:

app.use(cors(
  origin : "http://localhost:8080",
  credentials: true,
))

【问题讨论】:

Access-Control-Allow-Origin 必须是主机名,而不是 * 发送 cookie 时。 响应中Access-Control-Allow-Origin 的确切值是多少? 我们需要查看来自服务器的响应头。致电:curl -v -X OPTIONS http://localhost:8081 并回复您的问题 Access-Control-Allow-Origin: * 所以,正如我在 20 分钟前提到的,您必须传递一个主机名,而不是那里的 *。这也是错误消息准确告诉您的内容。 @zerkms 是的,你是对的,我必须将其更改为主机名,并保留凭据选项,并且它可以工作。非常感谢你们。 【参考方案1】:

我知道对于 OP 来说已经太晚了,但对于那些一直来这里的人来说——帮助我的是:

app.use(cors(
  preflightContinue: true,
  credentials: true,
));

来源:https://expressjs.com/en/resources/middleware/cors.html

【讨论】:

【参考方案2】:

我遇到了这个问题,我通过将标头 "Access-Control-Allow-Origin" 设置为前端的 URL 而不是“*”来解决它

更多详情:https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/CORSNotSupportingCredentials

【讨论】:

以上是关于如何通过 CORS 传递 cookie?的主要内容,如果未能解决你的问题,请参考以下文章

如何跨域传递 cookie

SignalR Cors Cookie 未发送

如何通过邮递员中的cookie传递会话ID并登录?

如何在 CURL 重定向上传递 cookie?

JSESSIONID 是如何传递的?作为标头参数还是作为 cookie 参数?

php中如何传递Session ID