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

时间:2020-01-31 02:15:47

标签: javascript authentication jwt local-storage subdomain

我们在相同的域但有不同的子域中有两个单独的网站/应用。

例如

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

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

或者有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

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

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中-窃听者将无法看到它。

答案 1 :(得分:1)

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