Safari全面禁止您在与父域不同的域的iframe中设置cookie,这是该死的服务器端CORS标头。
需要说明的是:用户在domainA.com上。domainB.com的iframe已打开,并尝试在iframe中的domainB.com上对用户进行身份验证。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的调用中发送:(