本地存储跨域 - Safari默认禁用它

Alo*_*iel 14 javascript safari html5 cross-domain local-storage

问题:

我使用了Ofir Dagan的github项目:存储跨域本地存储.

它实现了html5本地存储:https: //github.com/ofirdagan/cross-domain-local-storage


问题:

Safari默认情况下不允许第三方cookie(其他浏览器允许).

Safari隐私首选项包括:

在此输入图像描述

默认值为:"允许我访问的网站".

我读到了这些设置:

  1. 始终阻止 - 阻止所有第一方Cookie并阻止所有第三方Cookie.

  2. 仅允许来自当前网站 - 允许所有第一方Cookie并阻止所有第三方Cookie.

  3. 允许来自我访问的网站 - 允许所有第一方Cookie并阻止所有第三方Cookie,除非该第三方同时是第一方(基于当前Cookie和浏览历史记录).

  4. 始终允许 - 允许所有第一方Cookie并允许所有第三方Cookie.


解决方案我试过:

使用iframe(像素)的本地存储 - 我认为它不再适用于Safari - 是否有任何解决方法可以在iframe中为Safari设置第三方cookie?


我认为有一种方法可以在Safari上的第一方和第三方站点之间共享本地存储.(Facebook.com和Booking.com共享不同域之间的数据).

我成功地通过删除API并自己编写来实现它,但我不想删除API并自己实现它(希望有一个小的修复以支持Safari):

Iframe.html:

window.addEventListener('cors_event', function(event) {
    if(event.event_id === 'my_cors_message'){
        if (event.data.options.funcName == "SetItem") {
            localStorage.setItem(event.data.options.key, event.data.options.value);
        }
        else if (event.data.options.funcName == "GetItem") {
            return localStorage.getItem(event.data.options.key);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

MainPage:

<iframe id="target" src="iframe.html" frameborder="1"></iframe>

<script>

    var target = document .getElementById('target');
    target.onload = function(){
        target.contentWindow.postMessage('set', '*')
    }
</script>
Run Code Online (Sandbox Code Playgroud)

那么有人知道如何通过更改一些API逻辑来支持Safari来实现它吗?

任何帮助赞赏!

Yog*_*thi 9

跨存储库文档所述:

Safari 7+的注意事项(OSX,iOS)

Safari 7+默认禁用所有跨域本地存储访问.这是"阻止Cookie和其他网站数据"隐私设置被设置为"来自第三方和广告商"的结果.任何跨存储客户端代码都不会崩溃,但是,它只能访问沙盒隔离的本地存储实例.因此,以前由其他来源设置的数据都不可访问.如果是一个选项,可以回退到为这些用户代理使用根cookie,或者从服务器端存储请求数据.


Abh*_*bhi 5

您可以尝试Store.JS.根据文档:

store.js为跨浏览器本地存储公开了一个简单的API

  • 我不明白为什么这被接受为答案。Storejs并没有解决跨域存储问题。 (8认同)
  • store.js是否跨域工作?我看到它在哪里说跨浏览器,但没有看到任何对跨域的引用(这是非常不同的). (6认同)
  • 如果有人怀疑这对Safari跨域无效。因此,如果您的顶级域名是“ site-a.com”,而iframe是“ site-b.com”,则“ site-b”的数据将被清除。 (3认同)