凭证:'include'不包括Cookie头部

12
我在客户端使用credentials: 'include'mode: 'cors'。在服务器上,我看到access-control-allow-credentials: trueaccess-control-allow-origin: https://dev.com:9443头部。但是我没有看到我的cookie头部,而且我找不到为什么它没有发送的原因。如果需要更多详细信息,请告诉我。
fetch(url, {
  method: 'get',
  credentials: 'include',
  mode: 'cors',
  headers: {
    'Content-Type': 'application/json'
  }
});


选项请求头
:authority: prod.fakedomain.com
:method: OPTIONS
:path: /Search
:scheme: https
accept: */*
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9,fr;q=0.8,la;q=0.7
access-control-request-headers: content-type
access-control-request-method: GET
cache-control: no-cache
dnt: 1
origin: https://dev.com:9443
pragma: no-cache
referer: https://dev.com:9443/
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36

选项响应头
access-control-allow-credentials: true
access-control-allow-headers: content-type
access-control-allow-methods: GET,HEAD,POST
access-control-allow-origin: https://dev.com:9443
access-control-max-age: 1800
allow: GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, PATCH
content-length: 0
date: Mon, 04 Feb 2019 03:45:06 GMT
status: 200
vary: Origin
x-application-context: application:8080

获取请求头信息
:authority: prod.fakedomain.com
:method: GET
:path: /Search
:scheme: https
accept: */*
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9,fr;q=0.8,la;q=0.7
cache-control: no-cache
content-type: application/json
dnt: 1
origin: https://dev.com:9443
pragma: no-cache
referer: https://dev.com:9443/
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36

获取响应头信息
access-control-allow-credentials: true
access-control-allow-origin: https://dev.com:9443
content-encoding: gzip
content-type: application/json;charset=UTF-8
date: Mon, 04 Feb 2019 03:45:07 GMT
status: 200
vary: Origin,Accept-Encoding
x-application-context: application:8080

似乎您的服务器未返回cookies - 您如何检查服务器是否发送了cookies? - Kamil Kiełczewski
服务器不应该向我发送cookie。我想要将客户端的cookie发送给服务器。服务器想要查看客户端的cookie并根据其发送个性化响应。目前它无法看到客户端的cookie,只会发送一个通用的非个性化响应。 - anthony-dandrea
3
问题中的信息似乎表明您的浏览器在其 cookie 存储中尚未为 prod.fakedomain.com 域设置任何 cookie。您的浏览器将仅发送该域已经在先前从 prod.fakedomain.com 收到 Set-Cookie 响应头的某些响应中通过设置在浏览器的 cookie 存储中的 cookie。正如 @KamilKiełczewski 所示,该服务器似乎没有发送任何 Set-Cookie 响应头,因此看起来您从未在浏览器中设置任何 cookie。 - sideshowbarker
@sideshowbarker 谢谢!所以我已经设置了 dev.com 的 cookie,但没有设置 prod.fakedomain.com 的。我想让服务器(prod.fakedomain.com)看到我的 dev.com cookie。如果没有 prod.fakedomain.com 域名,那么这些 cookie 是否不会被发送? - anthony-dandrea
1
@anthony-dandrea 如果来自dev.com的cookies不是httpOnly,则可以尝试通过JS复制(读取和写入)cookies。 - Kamil Kiełczewski
谢谢大家。看起来我的问题与我想要发送的 cookie 所设置的域有关。如果你们中任何人想要发布答案,我会接受。 - anthony-dandrea
4个回答

10

我终于发现问题所在,是因为浏览器不允许两个不同域共享任何 cookie(除了同一二级域名),这已经超出了 credentials: include 的能力范围,在尝试了两个小时后...我发现 credentials: include 只意味着你可以发送 cookie,但并不意味着你可以发送来自两个不同域的 cookie。

无论你怎么做,更改浏览器设置、以任何方式设置 cookie 的 SameSite,都无法做到这一点...

这就是我的结论,希望你懂了...


1
可悲的是,我认为这现在是真的。有些旧链接/资源(包括 MDN fetch 文档)指向使用 SameSite=None + 允许凭据头 + fetch 'include' 选项的组合。但似乎都不起作用。 - Ladmerc
1
你有这里所声称的来源吗? - undefined

6

我通过进入Safari隐私设置并取消勾选防止跨站点追踪来解决了这个问题。

enter image description here


4
哇,这个起作用了!如何在Chrome中做同样的事情? - D0m3

2

我已经尝试了几天,得出了结论:

cedentials: 'include'

并且

xhrFields: { withCredentials: true}

仅适用于相同域名但不同端口,如果我们想要向另一个域名发出请求,我们必须手动将凭据(令牌等)添加到请求头中。


你有没有一个能证明这样的来源? - undefined

2
sideshowbarker在他的评论中提到,浏览器不会为prod.fakedomain.com设置cookie,而且似乎服务器也没有设置cookie。因此,如果您为dev.com设置了非httpOnly的cookie,则可以尝试通过JS将其复制到prod.fakedomain.com(通过读取和写入)。
如果您想在cookie中存储敏感数据(例如JWT令牌),请阅读有关XSS / XST攻击的信息,并考虑使用HttpOnly标志的可能性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接