如何在不同子域之间共享localstorage?

cat*_*use 9 javascript authentication subdomain local-storage jwt

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

\n\n

例如

\n\n
https://hello.website.com (Webapp 1)\nhttps://world.website.com (Webapp 2)\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

或者有更好的方法来做到这一点吗?

\n

Cer*_*nce 8

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

const url = 'https://world.website.com?token=' + authToken;
window.location.href = url;
Run Code Online (Sandbox Code Playgroud)

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

然后,在另一个域上,检查token搜索参数中是否有 a ,如果有,则将其提取并保存到 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

由于域位于 HTTPS 上,因此将令牌放在 URL 中基本上是安全的- 窃听者将无法看到它。但是,如果处理请求的服务器保存日志,您可能会发现由于这种方法,服务器的日志包含身份验证令牌是不合需要的。

另一种方法是:

  • Web 应用程序 1 使用负载中的令牌向 Web 应用程序 2 发出 POST 请求(其中 Web 应用程序 2 具有适当的 CORS 设置)
  • Web 应用程序 2 生成一个新的唯一 URL(例如,30 分钟后过期),将令牌与该 URL 相关联,并使用该 URL 响应 Web 应用程序 1 上的客户端
  • 客户端接收来自 Webapp 2 的响应,然后导航到刚刚给定的 Webapp 2 上的唯一 URL
  • Webapp 2 在处理请求时,会看到唯一的 URL 与令牌关联,并完成将该令牌与请求会话完全关联的过程

  • 不太安全,因为这些 URL 通常记录在 http 服务器日志中。最好使用此令牌发出跨站点 POST 请求。 (2认同)

Sap*_*asu 7

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


归档时间:

查看次数:

14355 次

最近记录:

3 年,11 月 前