Oauth2.0 |如何在 iframe 中运行的单页应用程序中管理用户会话?

Posted

技术标签:

【中文标题】Oauth2.0 |如何在 iframe 中运行的单页应用程序中管理用户会话?【英文标题】:Oauth2.0 | How to manage user session in Single Page application running in an iframe? 【发布时间】:2020-11-13 22:33:42 【问题描述】:

我是安全域的新手,最近我了解了 Oauth2.0/OpenID 连接和 JWT 令牌。我有一个现有的基于 REST 的 Web 应用程序,我需要在其中实现安全性。

服务器

Application A:Spring boot 后端应用服务器,暴露了一些与 mysql 数据库连接的 RestEndpoints。

前端

Application B:Spring boot Web Applicaiton,其中有一些用于登录的JSP页面和一些其他模板功能(也连接到后端服务器使用的同一个Mysql数据库)。

应用程序 C:在应用程序 B 中,我们有一个 iframe,Angular 应用程序在其中运行,Angular 应用程序调用后端服务器并显示数据。

未来我们也希望将 SSO 用于我们的应用程序。

当前安全性

目前我们在后端服务器上没有任何安全性(即我们可以简单地调用 RestEnd 点而无需任何身份验证),应用程序 B 具有通过 spring 安全性实现的基本登录安全性。用户在应用程序 B 上登录,然后他/她也可以使用应用程序 C (Angular)。用户会话由应用程序 B 管理,当会话到期时用户强制退出。

Oauth2 授权

我们试图实现的是将服务器(应用程序 A)作为 Oauth2Resource 服务器和 Oauth2Authorization 服务器。应用程序 B(JSP 前端)从中删除数据库连接以及登录控制器,应用程序 B 将调用 oauth2 服务器以使用“密码”流授权用户,当应用程序 B 将收到 access_token 和 refresh_token 时,它将以某种方式将其传递给 Iframe (角度应用程序)将这些令牌存储在 cookie 中,并且在对服务器 angular 的每个后续请求都会向其添加访问令牌。

我读过有关 Oauth2.0 已弃用“隐式流”的文章,他们更喜欢使用“授权码流”。我很难理解如何将此流程用于单页应用程序(SPA 之类的 Angular)。如果我使用隐式流程,那么在哪里存储 access_token 和 refresh_token ?我知道将这两个令牌都存储在 cookie 中并不是一个好习惯。

现在如何管理用户会话?到目前为止我收集到的是,在使用承载访问令牌请求资源服务器时,当我们得到未经授权的响应时,我们将在刷新令牌的帮助下请求新的访问令牌,但如果 refresh_token 也过期,我将强制用户登录屏幕。这是正确的方法吗?

对于冗长的上下文感到抱歉,我们将不胜感激。谢谢

【问题讨论】:

【参考方案1】:

几个建议:

使用低成本的云授权服务器,例如 Azure 或 AWS 专注于构建出色的 UI 和 API,这并不容易

在流程方面,使用授权代码流程 (PKCE) 和 OIDC Client 库来管理 SPA 安全性。

我的First Tutorial 可能是一个很好的起点,以了解如何进行集成。一般:

SPA 使用短期访问令牌并应将它们存储在内存中 SPA 传统上不直接使用刷新令牌

请随时回复后续问题,我可以为您指出其他资源。顺便说一句,您应该避免在 iframe 中运行 SPA - 请参阅我的 other answer。

【讨论】:

以上是关于Oauth2.0 |如何在 iframe 中运行的单页应用程序中管理用户会话?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 iframe 中 AJAX 调用的完成来运行函数

如何在 Gatling 负载测试中为多个虚拟用户使用单个 OAuth2.0 令牌

谷歌应用引擎 oauth2 提供商

低代码如何构建支持OAuth2.0的后端Web API

Spring Security实现OAuth2.0授权服务 - 进阶版

低代码如何构建支持OAuth2.0的后端Web API