【问题标题】:Set cookie from subdomain A for subdomain B从子域 A 为子域 B 设置 cookie
【发布时间】:2018-03-09 12:57:44
【问题描述】:

http://subdomain-a.my-site.com:3000,我向http://subdomain-b.my-site.com 进行跨域XHR (ajax) 调用。

我的 jQuery 客户端有以下设置(用于测试目的):

  • crossDomain = true -> 用于请求其他域
  • withCredentials = true -> 用于接受来自 ajax 调用的 Set-Cookie 标头

Nginx 服务器已配置为在响应中添加以下标头:

Access-Control-Allow-Origin: http://subdomain-a.my-site.com:3000
Access-Control-Allow-Credentials: true

HTTP 响应还包含一些带有以下域的 Set-Cookie 标头:

  • .my-site.com
  • 没有精确的域(期望端点域:subdomain-b.my-site.com

观察:

  • Chrome 的控制台未显示此配置存在 CORS 问题。
  • 收到HTTP Response后,我去chrome://settings/content/cookiessubdomain-asubdomain-b的cookie设置为零。

问题 => 我是在尝试做一些可能的事情还是不可能的事情?如果可能的话,我是否错过了一些配置?

约束: 我知道有另一种解决方案,就像 Google Analytics 设置 cookie 一样(它调用服务,然后从页面中的嵌入式 JS 设置 cookie),但是我们有很多前端应用程序并且无法更新它们来完成这个技巧。我们的解决方案是使用 nginx。

【问题讨论】:

  • 无法跨子域设置 cookie。页面只能在其自己的域或父级中设置 cookie。
  • 显示浏览器网络工具中的Set-Cookie 响应是什么

标签: jquery http nginx cookies cross-domain


【解决方案1】:

有可能。我错过了以下配置:

withCredentials = true 是错误的,xhrFields: {withCredentials: true} 是解决方案。

关于 HTTP 响应,我们有以下 Set-Cookie 标头:

Set-Cookie: authtoken=value; Path=/; HttpOnly
Set-Cookie: authtoken=value; Domain=.my-site.com; Path=/; HttpOnly

现在,如果您转到 subdomain-b.my-site.com 并打开 cookie 的选项卡,您将看到带有 subdomain-b.my 的 authtoken cookie -site.com 域。这是用 Chrome、Firefox 和 Safari 测试的。

注意: crossDomain = true 是不必要的,因为我们的 XHR HTTP 响应返回 Access-Control-Allow-Origin: http://subdomain-a.my-site.com:3000。但是xhrFields: {withCredentials: true} 是 jQuery 的强制要求。

【讨论】:

  • tnx @Gugelhupf,我有一个问题,设置 Domain=.my-site.com 将为所有子域设置 cookie,是否可以从 a.example.com 为确切的 b.example 设置 cookie .com?
  • 默认情况下没有(出于安全原因),但您可以进行显式配置以允许a.example.com设置b.example.com的cookie:添加所需的HTTP标头Access-Control-Allow-Origin + Access-Control-Allow-Methods 并从 a.example.com 配置您的 JS 客户端以接受跨域 cookie。
  • tnx,我进行了配置,但将域设置为“b.example.com”不起作用,听起来好像只有在域为“.example.com”时才有效
  • 如果您将域设置为.example.com,它将起作用,这是正常行为,这里没有什么特别的。如果您的配置正确,它也应该与 b.example.com 一起使用,我认为您错过了带有 HTTP 响应标头的服务器端或用于接受跨域 cookie 的 JS 客户端选项。