如果 CORS 标头“Access-Control-Allow-Origin”为“*”,则不支持凭据

Posted

技术标签:

【中文标题】如果 CORS 标头“Access-Control-Allow-Origin”为“*”,则不支持凭据【英文标题】:Credential is not supported if the CORS header ‘Access-Control-Allow-Origin’ is ‘*’ 【发布时间】:2019-04-24 21:55:03 【问题描述】:

我的应用程序在 Java Web 应用程序中执行一些 REST 请求。这些请求是 CORS 请求,因此浏览器每次在真正的请求之前执行 OPTION 预检。 每个请求都类似于

主机:localhost:8080 用户代理:Mozilla/5.0(Windows NT 6.1;Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0 接受: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 接受语言:it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3 接受编码: gzip,放气访问控制请求方法:GET 访问控制请求标头:iv-groups、iv-user、x-xsrf-token 来源: http://localhost:4200 连接:keep-alive 缓存控制:max-age=0

java 应用程序的响应是:

HTTP/1.1 200 设置 Cookie:JSESSIONID=70A5ED7E8D32DCEE55991D3945994AB0; 路径=/blalab; HttpOnly Set-Cookie: XSRF-TOKEN=35ad4230-b664-400c-84c0-7d06877bf05d;路径=/变化:原点 变化:访问控制请求方法变化: 访问控制请求标头访问控制允许来源: http://localhost:4200 访问控制允许方法: GET、POST、PUT、DELETE、HEAD、OPTIONS 访问控制允许标题: iv-groups、iv-user、x-xsrf-token 访问控制允许凭据: 真正的访问控制最大年龄:1800 允许:GET、HEAD、POST、PUT、DELETE, TRACE、OPTIONS、PATCH X-Content-Type-Options:nosniff X-XSS-防护:1;模式=块缓存控制:无缓存,无存储, max-age=0, must-revalidate Pragma: no-cache Expires: 0 X 帧选项:拒绝内容长度:0 日期:2018 年 11 月 22 日,星期四 格林威治标准时间 08:31:18

对于 Firefox,如果 CORS 标头 Access-Control-Allow-Origin*,则此响应是控制台上的 CORS 违规。

对于谷歌浏览器,请求正常,内容显示。

【问题讨论】:

【参考方案1】:

如果您在客户端请求中使用 withCredentials,就会发生这种情况。在这种情况下,您可以修改服务器端以检查允许的引用者并在 Access-Control-Allow-Origin 标头中发送正确的 url。如果您不使用凭据,则接受 *。

更多信息可以在这里找到:https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/CORSNotSupportingCredentials

【讨论】:

但是您如何查看服务器响应包含在标头中 Access-Control-Allow-Origin: localhost:4200 而不是 Access-Control-Allow-Origin: * 在 google chrome 中总是可以但在Firefox 似乎问题一直存在。【参考方案2】:

对于所有来这里搜索此问题的人:

我安装了一个扩展 (CORS Unblock),它覆盖了标题。将其关闭或卸载即可解决问题。

【讨论】:

是的。我无法登录推特,我真的怀疑没有 Firefox 用户可以登录推特。我正在本地处理代码,我安装了一个 CORs Unblock 扩展,这样我就可以让它在本地运行。所以,我希望大型浏览器能够为 COR 实现更多选项,例如白名单,或者为 localhost 关闭它的能力。【参考方案3】:

这个配置对我有用。关注客户端withCredentials: true

客户端配置:

config = 
    url:'http://somedomain',
    method:'post',
    withCredentials: true,
    data:myfield:"myvalue"
;

axios.request(config);

服务器端配置:

Access-Control-Allow-Credentials   true
Access-Control-Allow-Headers  X-PINGOTHER, Content-Type
Access-Control-Allow-Methods GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS
Access-Control-Allow-Origin: http://localhost:4200 // WILD CARD WILL NOT WORK WHEN POSTING 

【讨论】:

问题中的服务器响应显示Access-Control-Allow-Origin: http://localhost:4200

以上是关于如果 CORS 标头“Access-Control-Allow-Origin”为“*”,则不支持凭据的主要内容,如果未能解决你的问题,请参考以下文章

即使存在标头,CORS 也会失败

即使存在标头,CORS 也会失败

在 IE10 的 AJAX CORS 请求中添加自定义标头时,CORS 请求中止

CORS Access-Control-Max-Age 缓存了啥

IE XdomainRequest CORS 问题

离子4中的Cors问题