如何使用JavaScript在浏览器中进行多重OAuth2身份验证

ycggw6v2  于 2022-12-03  发布在  Java
关注(0)|答案(1)|浏览(142)

问题

我需要OAuth2令牌,用于从多个OAuth服务器访问浏览器的用户,以便拥有访问多个资源的访问令牌。
OAuth身份验证过程在用户单击单个按钮时触发,我们称之为Login。
我们所做的并不完全是让用户同时使用Google和Azure AD进行身份验证,因此可以获得每一个的令牌。(* 必须为每一个管理单独的凭据是一个公认的痛点。
但是问题是如何编写JavaScript代码来触发和管理使用回调和浏览器重定向的验证。它们都必须简单地重新加载用户现有的页面,在隐藏的表单字段中存储两者的JWT。
(使用会话存储是可以接受的,并且无论如何都会发生,但它必须在重定向之间保留。)*

限制

  • 无法更改基本要求
  • 无法添加新页面或从根本上更改Web应用程序布局和页面
  • 使用非SPA的普通JavaScript Web应用程序。每个页面都可以是半SPA,但最终会将JWT传回服务器使用,并获取另一个页面,以便用户与服务器获取的资源数据进行额外交互。
  • 不可能进行正常的服务器端编码。特殊用途的引擎正在执行工作流业务流程,并且具有有限的低级别编码功能。

可能的解决方案

  • 使用隐藏iframe可能是可能的,如果仔细管理和不可见的用户
  • 同步身份验证,其中一个OAuth进程在另一个OAuth进程开始之前完成

* 已尝试 *

  • 使用链接的承诺,但在重定向过程中丢失了东西,出现了竞态条件,并出现了混乱。
  • 要使用隐藏表单字段的更改状态事件来编排同步身份验证,即当一方完成将表单字段设置为其他方启动的已获取令牌时

寻找

  • 关于如何解决问题的一些建议。请指出你的想法是你已经做过或看到过并知道有效的东西,还是你认为可能有效的东西;我很感激这两点:-)
  • 暗示那些不起作用并且应该避免的事情。
bsxbgnwa

bsxbgnwa1#

我通过使用浏览器会话状态来安排首先与一个提供者进行身份验证,然后完成另一个提供者的身份验证,从而解决了这个问题。
基本问题是确保每次在包含验证代码的重定向后重新加载页面时,正确的验证提供程序将获取代码并完成获取令牌的操作。会话状态用于在每次完成时存储指示符。由于它们都使用回调,因此有必要使用promise链接回调。

相关问题