javascript - 在应用程序和 iframe 中的小部件之间共享身份验证状态(即通用登录)
问题描述
语境:
service.io 上托管了一个 Web 应用程序,这是大多数用户登录或创建帐户的地方,因为它为用户提供了一大堆服务。用户还可以访问一个小部件,他们可以将其嵌入到他们赢得的网站中,以向他们的用户提供我们某些服务的功能。
问题:
因为应用程序和小部件在技术上将存在于 2 个不同的域中,所以无法共享身份验证状态。这意味着每当小部件的用户必须登录小部件所在的网站时,该网站被包裹在 iframe 中以防止任何内容泄漏。这并不理想。
当前解决方案:
由于问题在于小部件将位于不同的域中,因此我决定将小部件托管在应用程序所在的域 (abc.com/embeds) 下,并使用 iframe 的 src 属性来加载该路由 (<iframe src ="abc.com/embeds)。为此,我使用所谓的多区域并通过 NextJS 框架重写(https://nextjs.org/docs/advanced-features/multi-zones。所以应用程序将存在于 /* 下,而小部件将存在于 /embeds 下。
现在的问题是我也必须为小部件使用 NextJS,这不是最佳的,因为我没有为小部件使用任何与 Next 相关的功能,因此不必要地增加了包大小。
理想的解决方案(从我的角度来看):
最好和最简单的方法是,如果我可以在 vercel 上托管两个应用程序时使用多区域 + 重写,但不使用 NextJS 作为小部件。
我能想到的唯一其他解决方案是以某种方式在小部件和应用程序之间同步身份验证状态,而无需在应用程序域中托管小部件。我自己还没有实现 auth0 通用登录,但我相信它在概念上是相似的?
问题:
- 我将如何实现上述任一解决方案?
- 有更好的选择吗?
- 在安全方面,当前的解决方案是否可靠?或者我应该让用户登录每个小部件?
可视化:
解决方案
正如@cbr 所建议的 - 您可以使用postMessage
,主机网站(即您的小部件)将用于postMessage
您在 service.io 上的应用程序
要确保安全,请执行以下操作
origin
通过您的小部件发送targetWindow
和接收时确认evt.origin
- 这满足您确认发送给谁的需要,并且接收者也确认谁发送了消息。如果有多个
targetWindow
实例,只需命名它们,您就可以将相应的消息定向到预期的窗口。
参考:https ://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage
推荐阅读
- ruby-on-rails - 尝试创建新记录时 UserCrud#new 中的 NoMethodError
- python - 将 Flask Server 作为线程启动
- angular - PrimeNG 表不出现
- json - FreeText 搜索用例中的嵌套内部点击
- python-3.x - Python生成器只返回yield的第一个实例
- javascript - 我可以使用解构来创建深层副本吗?
- android - 在 x86_64 上使用 x86_64 NDK 工具链链接失败
- laravel - 在 Laravel 中合并两个集合并访问它
- c# - C# xUnit 测试错误 - 以下构造函数参数没有匹配的夹具数据
- gulp - 如何修复“多次调用写回调”