如何在不同子域之间共享本地存储?

Posted

技术标签:

【中文标题】如何在不同子域之间共享本地存储?【英文标题】:How to share localstorage among different subdomains? 【发布时间】:2020-05-16 17:17:09 【问题描述】:

我们在同一个域但不同的子域中有两个独立的网站/应用程序。

例如

https://hello.website.com (Webapp 1)
https://world.website.com (Webapp 2)

我们想做的是在 Webapp 1 上登录用户,在登录并单击 Webapp 1 中的按钮后,我们希望将用户重定向到 Webapp 2。但是,Webapp 2 需要相同的身份验证令牌当前存储在 Webapp 1 的本地存储中。如何使本地存储内容可用于 Webapp 2?

或者有更好的方法吗?

【问题讨论】:

这能回答你的问题吗? use localStorage across subdomains 嗯,不是这样,因为登录不会发生在父域上,而是发生在另一个子域上。 【参考方案1】:

由于域不相同,因此无法直接将信息从其中一个的本地存储传输到另一个,但由于站点使用 HTTPS,因此应该安全且容易足以将身份验证令牌作为搜索参数发送。例如,重定向时,不是重定向到https://world.website.com,而是取https://hello.website.com的当前身份验证令牌并附加它,然后重定向:

const url = 'https://world.website.com?token=' + authToken;
window.location.href = url;

(如果身份验证令牌中可能包含特殊字符,您可能需要先对其进行转义)

然后,在另一个域上,检查搜索参数中是否有token,如果有,将其提取并保存到localStorage:

const paramsMatch = window.location.href.match(/\?.+/);
if (paramsMatch) 
  const params = new URLSearchParams(paramsMatch[0]);
  const authToken = params.get('token');
  if (authToken) 
    localStorage.authToken = authToken;
  

由于域使用 HTTPS,因此将令牌放入 URL is safe - 窃听者将无法看到它。

【讨论】:

【参考方案2】:

这是localstoragesessionstorage 的限制。你不能。 iframe 有一些解决方法,但它们既不优雅也不安全。您应该使用具有适当域属性domain=example.com 的cookie。您可能还想阅读以下关于 cookie 与本地存储的安全性的答案:https://***.com/a/54258744/1235935

【讨论】:

为什么使用 iframe 不安全?

以上是关于如何在不同子域之间共享本地存储?的主要内容,如果未能解决你的问题,请参考以下文章

chrome 扩展通过共享本地存储将多条消息传递到外部站点

什么是 Python 中的“线程本地存储”,为什么需要它?

详解NFS-----共享存储服务

并发设计模式 | ThreadLocal线程本地存储模式

本地存储和云存储之间的区别

NFS共享存储服务