CORS、withCredentials和第三方Cookie

7
我想要进行一次CORS GET请求,并带上cookie。我在服务器端设置了所有的头信息(access-control-allow-originaccess-control-allow-credentialsaccess-control-allow-headers),并在jquery ajax请求中使用了withCredentials: truecrossDomain: true。当我告诉浏览器允许第三方cookie时,一切都能正常工作。有没有办法在不强制访问者允许第三方cookie的情况下实现这个功能?我甚至尝试过重定向用户并返回重定向,但是CORS会拒绝发送cookie。:/

我已经尝试过通过ajax和iframe进行CORS请求。


你说的“允许第三方cookie”是什么意思?CORS仍然执行cookie的同源策略,因此它只能发送来自服务器来源的cookie。你不能将一个cookie从一个来源发送到另一个不同的来源。 - monsur
我有一个来自A.com域名的页面,我正在尝试在A.com的页面上从B.com进行GET/POST请求。这两个域名都是可信任的。这样说通吗? - Charlotte Tan
A.com只能读/写A.com的cookie。B.com只能读/写B.com的cookie。withCredentials不允许A.com上的Javascript读取B.com的cookie,它只表示从A.com到B.com的请求应包括B.com的cookie。因此,即使使用CORS,cookie的同源策略仍然得到执行。 - monsur
这就是问题所在,如果我禁止第三方cookie,那么发送到B.com的请求将不包括B.com的cookie。 - Charlotte Tan
1
在这种情况下,查看您用于发出请求的代码以及捕获请求和响应头(从浏览器调试器中)的截图会很有用。 - monsur
2个回答

7
我认为这是不可能的。请参见我的(旧但相关的)博客文章。 唯一可靠的方法是使用第一方Cookie(即在顶层窗口中打开窗口,如单独的选项卡,或重定向当前窗口)。
但在某些情况下,这并不是必要的。浏览器对第三方Cookie的概念有稍微不同的理解,并且默认行为也不同。这篇文章很好地概述了这些细节。因此,在某些情况下,您可以使用技巧来启用(或至少检测)页面上的Cookie使用。
其他解决方法包括将一个服务器放置在另一个服务器的子域下(子域通常不被视为第三方),或更改流程以便用户通过其他方式进行身份验证而不是使用Cookie。

1
如果您设置了cookie(源2设置cookie),则应该知道将使用第三方cookie,但是如果您只获取cookie(仅在响应中发送源2的cookie而不进行设置),则没有理由让第三方cookie发挥作用。
因此,我认为您在源2中设置了一个cookie,并因此强制启用了第三方cookie。
请注意,CORS响应中设置的cookie受到正常第三方cookie策略的限制。在上面的示例中,页面从foo.example加载,但第19行的cookie由bar.other发送,因此,如果用户的浏览器配置为拒绝所有第三方cookie,则不会保存该cookie。Cross-Origin Resource Sharing mozilla.org

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