Safari全面禁止您在与父域不同的域的iframe中设置cookie,这是该死的服务器端CORS标头。
要澄清:用户位于domainA.com上。 domainB.com的iframe已打开, 并尝试在domainB.com内对用户进行身份验证 iframe。 Set-Cookie标头是从domainB.com iframe内的服务器返回的,具有所有必需的标头,但Safari不会在后续调用中将其发送回去。
一个旧的解决方法是从iframe提交表单,然后在响应中设置cookie。我想他们喜欢用户单击某些内容以提交表单的事实。您必须轮询cookie以查看响应何时返回,因为表单提交没有回调,对于HttpOnly cookie,您不能,但是嘿,它起作用了!直到没有。
然后,最近的解决方法是将用户重定向到全新的窗口/标签中的iframe域,在其中设置随机cookie,从那时起,该子域在iframe中被“信任”。同样,它需要单击以打开新的窗口/选项卡,甚至还可以直观地看到新选项卡的打开。很多安全性,诸如此类的标准。
现在,从Safari 13开始-没有其他解决方法。没有更多安全的iframe cookie设置?
任何其他身份验证方案都对我们不利(例如Auth-X标头)。我们需要使用HttpOnly安全cookie,因为我们不希望JavaScript客户端以任何方式访问该令牌。
要清楚,所有其他浏览器都可以正常运行。
有人有什么建议吗?
编辑:
感谢链接@tomschmidt,这似乎是正确的方向。 我尝试使用Apple的Storage Access API,但是很遗憾,尽管我确保在使用API初始化登录逻辑之前先请求访问权限:
requestStorageAccess = async() => {
return new Promise(resolve => {
//@ts-ignore
document.requestStorageAccess().then(
function () {
console.log('Storage access was granted');
resolve(true);
},
function () {
console.log('Storage access was denied');
resolve(false);
}
);
});
}
const storageAccessGranted = await requestStorageAccess();
console.log(storageAccessGranted) // prints 'true'
await login();
仍然,在/ login API响应中收到的cookie不会在随后的对该API的调用中发送:(
答案 0 :(得分:3)
我想我可能已经找到了解决方案:Apple的Storage Access API: https://webkit.org/blog/8124/introducing-storage-access-api/
答案 1 :(得分:2)
因此,只要新窗口存储了您要存储的cookie,解决方法仍然会起作用。 iframe仍然无法存储自己的Cookie。就我而言,我只需要会话ID cookie。因此,当用户授予存储访问权限时,我将打开一个小的弹出窗口。它获取并存储会话ID Cookie,然后关闭并重新加载iframe。然后,iframe可以访问会话ID Cookie,并在后续请求中发送它。我认为这只是暂时的,看起来他们将来打算从弹出窗口中删除存储访问权限。也许他们会修复当时无法存储Cookie的iframe。
答案 2 :(得分:-3)
只需转到首选项 command + ,
--> 隐私并取消选中防止跨站点跟踪