我的客户的站点(siteA.com)显示来自远程服务(forms.siteB.com)的表单。除iOS和macOS上的Safari以外,该表格均可在所有浏览器中正确加载。在Safari中,显示以下cookie通知:您的浏览器当前设置为阻止cookie。您必须先更改浏览器设置以允许Cookie,然后才能填写此表单。完成后,您可以还原设置。
据我所知,Safari正在使用ITP并阻止了第三方Cookie。我一直在阅读有关存储会话API(https://webkit.org/blog/8124/introducing-storage-access-api/)的信息,但是不确定是否会提供解决方案。表单的iframe代码包括sandbox="allow-storage-access-by-user-activation allow-scripts allow-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 Doc表单的iframe一起使用。有人知道Google是否会在自己的目标上做一些特别的事情来使嵌入式表单能够跨域设置Cookie?
答案 0 :(得分:2)
我一直在研究这个问题,整个过程都很糟糕。
您是正确的,除非您可以将表单托管在子域上(这不太可能),否则它将不起作用。
您需要在新窗口(或重定向当前窗口)中访问表单的域并设置cookie,以便Safari知道您之前已访问过该站点。然后,您可以请求存储访问权限,它将弹出一个对话框,您应该没事。
这是一种糟糕的体验,尽管糟糕透顶,但最好只是在新窗口中打开表格并在其中填写表格。
非常令人沮丧,但是由于这种隐私过大,看来通过iframe的嵌入式功能正在淘汰。
除非有人可以找到更多的骇客!