为什么访问控制允许凭据在Crome中不起作用?

时间:2019-03-27 09:45:10

标签: google-chrome cookies cors credentials access-control

我正在尝试实现跨域SSO-Auth-Server。目标是通过XmlHttpRequest从https://auth.my-domain.com/profile读取https://app.other-domain.com提供的经过身份验证的用户信息。 (不是jsonp!)因此必须将cookie从app.other-domain.com提供到auth.my-domain.com。

在Firefox中工作正常。但不是在Google-Chrome中。更精确地说:在FF中,cookie与每个XHR一起通过任何domainborders一起发送,但是chrome仅将cookie发送到相同的2级域。

Firefox: auth.my-domain.com <> app.my-domain.com  OK
Firefox: auth.my-domain.com <> app.other-domain.com  OK
Chrome:  auth.my-domain.com <> app.my-domain.com  OK
Chrome:  auth.my-domain.com <> app.other-domain.com  FAIL :(

Chrome 73.0.3683.86 Firefox 66.0.1(64位) 操作系统:Ubuntu 18.10

据此(以及我阅读的许多其他文档),它应该可以工作: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

这是在Chrome中不起作用的确切示例: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials

我找不到任何无法在Chrome浏览器中正常运行的信息。在网络中搜索仅会带来一些实现失败,例如被遗忘的或无效的访问控制标头,客户端中缺少.withCredentials标志,阻止SameSite cookie参数……我不知道,这里出了什么问题。

测试/复制:

身份验证服务器:

https://auth.my-domain.com/profile

在auth.my-domain.com上进行身份验证之后,将设置以下Cookie(并随每个请求更新):

set-cookie: test=1; expires=Wed, 27-Mar-2019 08:32:42 GMT; Max-Age=60; path=/; domain=auth.my-domain.com; secure; HttpOnly

客户端脚本

https://app.other-domain.com/

var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://auth.my-domain.com/profile');
xhr.withCredentials = true;
xhr.onload = function () {
  console.log(xhr.responseText);
}
xhr.send();

客户请求标头(Chrome DevTools)

Origin: https://app.other-domain.com
Referer: https://app.other-domain.com/
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36

有一个警告说明“显示了临时标题”。我对此没有任何解释。 :/

客户请求标头(FF DevTools)

Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: de,en-US;q=0.7,en;q=0.3
Connection: keep-alive
Cookie: test=1
Host: auth.zandura.loc
Origin: https://app.other-domain.com
Referer: https://app.other-domain.com/
TE: Trailers
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linu…) Gecko/20100101 Firefox/66.0

API端点响应标头:

access-control-allow-credentials: true
access-control-allow-origin: https://app.other-domain.com
access-control-allow-methods: GET
content-type: application/json; charset=utf-8
date: Wed, 27 Mar 2019 09:12:37 GMT
server: nginx/1.15.9
status: 200
x-powered-by: PHP/7.3.3

0 个答案:

没有答案