问题
我需要OAuth2令牌,用于从多个OAuth服务器访问浏览器的用户,以便拥有访问多个资源的访问令牌。
OAuth身份验证过程在用户单击单个按钮时触发,我们称之为Login。
我们所做的并不完全是让用户同时使用Google和Azure AD进行身份验证,因此可以获得每一个的令牌。(* 必须为每一个管理单独的凭据是一个公认的痛点。)
但是问题是如何编写JavaScript代码来触发和管理使用回调和浏览器重定向的验证。它们都必须简单地重新加载用户现有的页面,在隐藏的表单字段中存储两者的JWT。(使用会话存储是可以接受的,并且无论如何都会发生,但它必须在重定向之间保留。)*
限制
- 无法更改基本要求
- 无法添加新页面或从根本上更改Web应用程序布局和页面
- 使用非SPA的普通JavaScript Web应用程序。每个页面都可以是半SPA,但最终会将JWT传回服务器使用,并获取另一个页面,以便用户与服务器获取的资源数据进行额外交互。
- 不可能进行正常的服务器端编码。特殊用途的引擎正在执行工作流业务流程,并且具有有限的低级别编码功能。
可能的解决方案
- 使用隐藏iframe可能是可能的,如果仔细管理和不可见的用户
- 同步身份验证,其中一个OAuth进程在另一个OAuth进程开始之前完成
* 已尝试 *
- 使用链接的承诺,但在重定向过程中丢失了东西,出现了竞态条件,并出现了混乱。
- 要使用隐藏表单字段的更改状态事件来编排同步身份验证,即当一方完成将表单字段设置为其他方启动的已获取令牌时
寻找
- 关于如何解决问题的一些建议。请指出你的想法是你已经做过或看到过并知道有效的东西,还是你认为可能有效的东西;我很感激这两点:-)
- 暗示那些不起作用并且应该避免的事情。
1条答案
按热度按时间bsxbgnwa1#
我通过使用浏览器会话状态来安排首先与一个提供者进行身份验证,然后完成另一个提供者的身份验证,从而解决了这个问题。
基本问题是确保每次在包含验证代码的重定向后重新加载页面时,正确的验证提供程序将获取代码并完成获取令牌的操作。会话状态用于在每次完成时存储指示符。由于它们都使用回调,因此有必要使用promise链接回调。