jQuery的跨域Ajax请求未发送Cookie

时间:2020-03-19 18:07:19

标签: google-chrome cookies cross-domain samesite

Internet上充斥着这种请求,但我又问了一次,因为所有答案似乎都在2014年左右。我也遇到类似的问题,但是旧的修复程序现在都无法正常工作,因此我不确定如果2020年及以后有什么新需求。

我正在尝试从domainA.comdomainB.com打电话。用户通过domainB.com进行身份验证,该身份存储在该域的Cookie中。

我对这两个域都有管理权限,因此我可以根据需要在任一端进行更改。

这是我在domainA.com网站上使用的jQuery ajax调用:

$.ajax({
    url: "https://domainB.com/endpoint",
    xhrFields: {
        withCredentials: true
    }}
)

我还尝试了其他属性,例如:

  • crossDomain: true
  • dataType: "json"

domainB.com网站收到了请求,但请求中没有Cookie

请求标头如下:

host -> domainB-host
connection -> close
accept -> */*
sec-fetch-dest -> empty
user-agent -> Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36
dnt -> 1
origin -> https://domainA.com
sec-fetch-site -> cross-site
sec-fetch-mode -> cors
referer -> https://domainA.com/
accept-encoding -> gzip, deflate, br
accept-language -> en-US,en;q=0.9

domainB.com上,我还设置了以下响应标题

Access-Control-Allow-Origin: https://domainA.com
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: Origin

有任何想法为何(我认为)正确设置了CORS时为什么domainB.com Cookie没有在domainA.com发出的请求中传递?

更新1 这在Firefox中有效,但在Chrome(在Mac上)中无效。我以前也曾在Firefox中进行过测试,但无法正常工作。通过以上配置,它实际上可以在Firefox中运行。

1 个答案:

答案 0 :(得分:0)

事实证明,这与Chrome在版本80中的更改有关:

Troy Hunt here有一个非常好的文章。

简而言之,现在唯一要传递的cookie是设置了SameSite=NoneSecure的cookie。因此,需要将cookie设置如下:

Set-Cookie: cookie-name=cookie-value; SameSite=None; secure

现在,这些是Chrome唯一用于跨站点请求的Cookie。