Set-Cookie header 无法跨域工作
Set-Cookie header not working across domain
我在访问网站 https://aaa.shared.com
。此网站(称为 A
)向 url https://zzz.shared.com/some/path
(网站 Z
)发送 xhr
请求,并收到以下响应 header小号:
access-control-allow-credentials: true
access-control-allow-origin: aaa.shared.com
set-cookie: foo=bar; expires=Fri, 01 Jan 2100 00:00:00 GMT; path=/; secure; samesite=none; httponly
(我跟着加了access-control
headers)
现在,我期望的是,每当我同时在 A 或 Z 上时,只要请求从 转到 Z(cross-origin 或 same-origin ,重要的是请求的 URL )浏览器会添加 cookie,但它不会!此外,我看不到它是在浏览器开发人员工具中设置的(F12 -> 应用程序 -> Cookies)。我正在使用 Chrome,但目标是跨浏览器解决方案。
我错过了什么?我发现很难找到有关 Set-Cookie
header 在请求不同来源时如何工作的详细信息。
编辑:rowan_z
最初建议将 samesite=lax
替换为 samesite=none
,因为此问题第一个版本中的 A 和 Z 是完全独立的域(仅共享 .com
部分)。我试过了,但没有用。但是现在我才知道,他们其实是被当成SameSite
,因为他们在shared.com
域的不同子域上。所以现在我相信 samesite=lax
也应该在这里工作。
更新:
最后,我只是将应用程序 aaa.shared.com
移动到具有某些路径 zzz.shared.com/aaa/path
的同一子域下,因为处理 cookie 和 CORS 非常困难。此外,将其配置为与 localhost
一起使用会增加额外的复杂性。
您已明确说明 SameSite=Lax
限制跨站点请求发送 cookie。这看起来像是您希望 SameSite=None
允许这些 cookie 的情况。
您所做的所有事情确实需要才能使其正常工作:
access-control-allow-credentials: true
access-control-allow-origin: aaa.shared.com
(不是通配符)
Secure
SameSite=None
发送请求时您只遗漏了一件事:credentials: 'include'。
我创建了一个模拟端点,您可以使用它来测试这行代码两次(在另一个域的控制台中):
fetch('https://Whosebug.free.beeceptor.com', { credentials: 'include' });
您会注意到将第二次发送 cookie。
如果模拟端点过期(不知道它会持续多久),或者如果有人破坏了它,您可以在 http://beeceptor.com 上用 JSON 在 header 中重新创建它配置:
{
"Content-Type": "application/json",
"Set-Cookie": "test=value; Path=/; Secure; SameSite=None;",
"access-control-allow-origin": "https://yourdomain",
"Access-Control-Allow-Credentials": "true"
}
我在访问网站 https://aaa.shared.com
。此网站(称为 A
)向 url https://zzz.shared.com/some/path
(网站 Z
)发送 xhr
请求,并收到以下响应 header小号:
access-control-allow-credentials: true
access-control-allow-origin: aaa.shared.com
set-cookie: foo=bar; expires=Fri, 01 Jan 2100 00:00:00 GMT; path=/; secure; samesite=none; httponly
(我跟着access-control
headers)
现在,我期望的是,每当我同时在 A 或 Z 上时,只要请求从 转到 Z(cross-origin 或 same-origin ,重要的是请求的 URL )浏览器会添加 cookie,但它不会!此外,我看不到它是在浏览器开发人员工具中设置的(F12 -> 应用程序 -> Cookies)。我正在使用 Chrome,但目标是跨浏览器解决方案。
我错过了什么?我发现很难找到有关 Set-Cookie
header 在请求不同来源时如何工作的详细信息。
编辑:rowan_z
最初建议将 samesite=lax
替换为 samesite=none
,因为此问题第一个版本中的 A 和 Z 是完全独立的域(仅共享 .com
部分)。我试过了,但没有用。但是现在我才知道,他们其实是被当成SameSite
,因为他们在shared.com
域的不同子域上。所以现在我相信 samesite=lax
也应该在这里工作。
更新:
最后,我只是将应用程序 aaa.shared.com
移动到具有某些路径 zzz.shared.com/aaa/path
的同一子域下,因为处理 cookie 和 CORS 非常困难。此外,将其配置为与 localhost
一起使用会增加额外的复杂性。
您已明确说明 SameSite=Lax
限制跨站点请求发送 cookie。这看起来像是您希望 SameSite=None
允许这些 cookie 的情况。
您所做的所有事情确实需要才能使其正常工作:
access-control-allow-credentials: true
access-control-allow-origin: aaa.shared.com
(不是通配符)Secure
SameSite=None
发送请求时您只遗漏了一件事:credentials: 'include'。
我创建了一个模拟端点,您可以使用它来测试这行代码两次(在另一个域的控制台中):
fetch('https://Whosebug.free.beeceptor.com', { credentials: 'include' });
您会注意到将第二次发送 cookie。
如果模拟端点过期(不知道它会持续多久),或者如果有人破坏了它,您可以在 http://beeceptor.com 上用 JSON 在 header 中重新创建它配置:
{
"Content-Type": "application/json",
"Set-Cookie": "test=value; Path=/; Secure; SameSite=None;",
"access-control-allow-origin": "https://yourdomain",
"Access-Control-Allow-Credentials": "true"
}