如何在不同的子域之间共享本地存储?
How to share localstorage among different subdomains?
我们有两个独立的网站/应用程序在同一个域中,但子域不同。
例如
https://hello.website.com (Webapp 1)
https://world.website.com (Webapp 2)
我们想要做的是在 Webapp 1 上登录用户,在登录并单击 Webapp 1 中的按钮后,我们希望将用户重定向到 Webapp 2。但是,Webapp 2 需要相同的当前存储在 Webapp 1 的本地存储中的身份验证令牌。如何使本地存储内容可用于 Webapp 2?
或者有更好的方法吗?
这是 localstorage
和 sessionstorage
的限制。你不能。 iframe
有一些解决方法,但这些方法既不优雅也不安全。您应该使用具有适当域属性 domain=example.com
的 cookie。您可能还想阅读以下关于 cookie 与 localstorage 安全性的回答:
由于域不同,因此无法直接将信息从其中一个域的本地存储传输到另一个域,但由于这些站点都在 HTTPS 上,因此应该足够安全和容易将身份验证令牌作为搜索参数发送。例如,重定向时,不是重定向到 https://world.website.com
,而是获取 https://hello.website.com
的当前身份验证令牌并附加它,然后 redirect:
const url = 'https://world.website.com?token=' + authToken;
window.location.href = url;
(如果认证token中可能有特殊字符,可能需要先转义)
然后在另一个域上,查看搜索参数中是否有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 mostly safe - 窃听者将无法看到它。但是,如果您处理请求的服务器保存了日志,您可能会发现由于这种方法,服务器的日志包含身份验证令牌是不可取的。
另一种方法是:
- Webapp 1 使用负载中的令牌向 Webapp 2 发出 POST 请求(其中 Webapp 2 具有适当的 CORS 设置)
- Webapp 2 生成一个新的唯一 URL(在 30 分钟后过期),将令牌与 URL 相关联,并使用 [=] 响应 Webapp 1 上的客户端41=]
- 客户端收到来自 Webapp 2 的响应,然后导航到 Webapp 2 上刚刚给出的唯一 URL
- Webapp 2,在处理请求时,看到唯一的 URL 与一个令牌相关联,并经历了将该令牌与请求会话完全关联的过程
我们有两个独立的网站/应用程序在同一个域中,但子域不同。
例如
https://hello.website.com (Webapp 1)
https://world.website.com (Webapp 2)
我们想要做的是在 Webapp 1 上登录用户,在登录并单击 Webapp 1 中的按钮后,我们希望将用户重定向到 Webapp 2。但是,Webapp 2 需要相同的当前存储在 Webapp 1 的本地存储中的身份验证令牌。如何使本地存储内容可用于 Webapp 2?
或者有更好的方法吗?
这是 localstorage
和 sessionstorage
的限制。你不能。 iframe
有一些解决方法,但这些方法既不优雅也不安全。您应该使用具有适当域属性 domain=example.com
的 cookie。您可能还想阅读以下关于 cookie 与 localstorage 安全性的回答:
由于域不同,因此无法直接将信息从其中一个域的本地存储传输到另一个域,但由于这些站点都在 HTTPS 上,因此应该足够安全和容易将身份验证令牌作为搜索参数发送。例如,重定向时,不是重定向到 https://world.website.com
,而是获取 https://hello.website.com
的当前身份验证令牌并附加它,然后 redirect:
const url = 'https://world.website.com?token=' + authToken;
window.location.href = url;
(如果认证token中可能有特殊字符,可能需要先转义)
然后在另一个域上,查看搜索参数中是否有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 mostly safe - 窃听者将无法看到它。但是,如果您处理请求的服务器保存了日志,您可能会发现由于这种方法,服务器的日志包含身份验证令牌是不可取的。
另一种方法是:
- Webapp 1 使用负载中的令牌向 Webapp 2 发出 POST 请求(其中 Webapp 2 具有适当的 CORS 设置)
- Webapp 2 生成一个新的唯一 URL(在 30 分钟后过期),将令牌与 URL 相关联,并使用 [=] 响应 Webapp 1 上的客户端41=]
- 客户端收到来自 Webapp 2 的响应,然后导航到 Webapp 2 上刚刚给出的唯一 URL
- Webapp 2,在处理请求时,看到唯一的 URL 与一个令牌相关联,并经历了将该令牌与请求会话完全关联的过程