设置Cookie标头无法跨域工作



我在https://aaa.shared.com网站上。此网站(称为A(向urlhttps://zzz.shared.com/some/path(网站Z(发送xhr请求,并接收具有以下标头的响应:

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标头(

现在,我所期望的是,无论何时我在A或Z上,无论何时请求到Z(跨原点或同源,重要的是请求的URL(,浏览器都会添加cookie,但它没有!此外,我看不到它是在浏览器开发工具(F12->Application->Cookies(中设置的。我使用的是Chrome,但目标是跨浏览器解决方案。

我错过了什么?我发现很难找到关于Set-Cookie标头在请求不同来源时如何工作的详细信息。

编辑:rowan_z最初建议将samesite=lax替换为samesite=none,因为这个问题的第一个版本中的A和Z是完全独立的域(仅共享.com部分(。我试过了,但没用。但现在我意识到它们实际上被视为SameSite,因为它们位于shared.com结构域的不同子域上。所以现在我认为samesite=lax也应该在这里工作。

更新:最后,我只是用一些路径zzz.shared.com/aaa/path将应用程序aaa.shared.com移到了同一子域下,因为处理cookie和CORS真的很困难。此外,将其配置为与localhost一起工作会增加额外的复杂性。

您所做的所有事情确实都是所必需的才能使其发挥作用:

  • access-control-allow-credentials: true
  • access-control-allow-origin: aaa.shared.com(不是通配符(
  • Secure
  • SameSite=None

发送请求时只缺少一件事:凭据:'include'。

我已经创建了一个模拟端点,您可以使用它来测试这行代码两次(在另一个域的控制台中(:

fetch('https://stackoverflow.free.beeceptor.com', { credentials: 'include' });

你会注意到饼干将在第二次发送。

如果mock端点过期(不知道它能持续多久(,或者有人破坏了它,你可以在http://beeceptor.com在标头配置中使用此JSON:

{
"Content-Type": "application/json",
"Set-Cookie": "test=value; Path=/; Secure; SameSite=None;",
"access-control-allow-origin": "https://yourdomain",
"Access-Control-Allow-Credentials": "true"
}

您已经明确声明了SameSite=Lax,它限制在跨站点请求中发送cookie。这看起来像是您希望SameSite=None允许这些cookie的情况。

更多详细信息:https://web.dev/samesite-cookies-explained

相关内容

最新更新