我的客户站点 (siteA.com) 显示来自远程服务 (forms.siteB.com) 的表单。该表单可以在除 iOS 和 macOS 上的 Safari 之外的所有浏览器中正确加载。在 Safari 中,会显示以下 cookie 通知:您的浏览器当前设置为阻止 cookie。您必须先更改浏览器设置以允许 cookie,然后才能填写此表格。完成后您可以恢复设置。
据我所知,Safari 正在使用 ITP 并阻止第三方 cookie。我一直在阅读有关存储 session API ( https://webkit.org/blog/8124/introducing-storage-access-api/ ) 的信息,但不确定它是否会提供解决方案。该表单的 iframe 代码包括 sandbox="allow-storage-access-by-user-activation allowed-scripts allowed-same-origin"
,我查看了以下代码:
<script>
function makeRequestWithUserGesture() {
var promise = document.requestStorageAccess();
promise.then(
function () {
// Storage access was granted.
},
function () {
// Storage access was denied.
}
);
}
</script>
<button onclick="makeRequestWithUserGesture()">Play video</button>
我不确定这是否适用于允许从第三方站点加载 iframe。它确实可以与用于嵌入 Google 文档表单的 iframe 配合使用。有谁知道 Google 是否做了一些特殊的事情来启用嵌入式表单来跨域设置 cookie?
最佳答案
我一直在研究这个问题,整个事情很糟糕。
你说得对,除非你可以在子域上托管表单(这不太可能),否则它不会起作用。
您需要在新窗口(或重定向当前窗口)中访问表单的域并设置 cookie,以便 Safari 知道您之前访问过该网站。然后您可以请求存储访问权限,它会弹出一个窗口,您应该没问题。
这是一次糟糕的经历,尽管很糟糕,但在新窗口中打开表单并在那里填写可以说更好。
非常令人沮丧,但由于这种隐私过度杀伤力,通过 iframe 嵌入的功能似乎即将被淘汰。
除非有人能找到更多的技巧!
关于javascript - Safari iframe cookie 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61942327/