【问题标题】:Credentials: 'include' not including Cookie header凭据:“包括”不包括 Cookie 标头
【发布时间】:2019-06-27 19:52:33
【问题描述】:

我在客户端上使用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

【问题讨论】:

  • 您的服务器似乎没有发回 cookie - 您如何检查服务器是否发送了 cookie?
  • 服务器不应该向我发送cookies。我想向服务器发送客户端的 cookie。服务器希望查看客户端的 cookie 并根据它们发送个性化响应。目前它看不到客户端 cookie,只是发回一个通用的非个性化响应。
  • 问题中的信息似乎表明您的浏览器实际上还没有在其 cookie 存储中为 prod.fakedomain.com 域设置 cookie。您的浏览器将发送回prod.fakedomain.com 的唯一 cookie 是该域的 cookie,这些 cookie 已由 prod.fakedomain.com 的一些先前响应设置在您的浏览器的 cookie 存储中,其中包括 Set-Cookie 响应标头。正如@KamilKiełczewski 指出的那样,该服务器似乎没有发回任何 Set-Cookie 标头,因此您似乎永远不会在浏览器中设置 cookie
  • @sideshowbarker 谢谢!所以我为dev.com 设置了cookie,但不是prod.fakedomain.com。我希望服务器 (prod.fakedomain.com) 看到我的 dev.com cookie。如果没有prod.fakedomain.com 域,这些不会发送吗?
  • @anthony-dandrea 如果来自 dev.com 的 cookie 不是 httpOnly 那么您可以尝试通过 JS 复制 cookie(读写)

标签: javascript cookies fetch fetch-api


【解决方案1】:

正如sideshowbarker 在他的评论中提到的那样,浏览器没有为域prod.fakedomain.com 设置 cookie,看起来服务器也没有设置 cookie。因此,如果您为dev.com 设置了cookie,并且它们不是httpOnly,那么您可以尝试将它们复制到prod.fakedomain.com(通过JS 读写)。

如果您想在 cookie 中存储敏感数据(例如 JWT 令牌),请阅读有关 XSS/XST 攻击的信息并考虑使用 HttpOnly 标志的可能性。

【讨论】:

    【解决方案2】:

    我可以通过进入我的 Safari 隐私设置并取消选中 Prevent cross-site tracking 来解决此问题

    【讨论】:

    • 哇这工作!如何在 chrome 上做同样的事情?
    【解决方案3】:

    我终于发现问题只是浏览器不允许两个不同的域共享任何cookie(相同的二级域除外),它超出了credentials: include可以做的事情,经过2个小时的尝试......我发现@987654322 @ 只是意味着你可以发送 cookie,但这并不意味着你可以发送具有两个不同域的 cookie..

    不管你做什么,改变浏览器设置、设置cookie的SameSite任何方式,就是不能这样做......

    这就是我的结论,希望你明白...

    【讨论】:

    • 可悲的是,我相信现在情况确实如此。有旧链接/资源(包括 MDN 获取文档)指向使用 SameSite=None + Allow Credentials 标头 + fetch 'include' 选项的组合。似乎都没有工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 2012-01-23
    相关资源
    最近更新 更多