OAuth2 -从现有Web应用程序启动SPA,无需用户再次进行身份验证

u4dcyp6a  于 2023-01-12  发布在  其他
关注(0)|答案(2)|浏览(150)

背景

我们有一个现有的传统Web应用程序(Wicket/Java/Spring/Tomcat),我们正在逐步迁移到Vue.js应用程序/SPA。因此,当用户导航到应用程序的某些部分时,我们会提供SPA,用户会与SPA交互,直到他们再次导航到应用程序的旧部分。
所有用户身份验证目前都由传统的webapp处理,这会导致一个tomcat会话(JSESSIONID cookie)。
SPA目前与主java monolith应用程序上的API进行通信,这与服务于传统webapp的应用程序相同,因此目前我们通过检查SPA请求中是否存在JSESSIONID cookie/tomcat http会话来处理身份验证。

┌──────────────┐
       │  Browser     │
       │              │          ┌────────────┐
       │  ┌──────┐    │          │  Monolith  │
 ──────┼─►│ HTML │◄───┼─────────►│    java    ├──────────────┐
       │  └──────┘    │          └────────────┘              ▼
       │              │             ▲             ┌──────────────────────┐
       │ ┌─────────┐  │             │             │ OAuth2 Authorization │
       │ │   SPA   │◄─┼─────────────┘             │       Server         │
       │ │ (VueJs) │  │                           └──────────────────────┘
       │ └────┬────┘  │                                      ▲
       │      │       │                                      │
       └──────┼───────┘               ┌──────────────┐       │
              │                       │ Microservice │       │
              └──────────────────────►│     java     ├───────┘
                                      └──────────────┘

要求

我们正在构建新的微服务(使用API),我们希望SPA能够与之对话,因此我们共享JSESSIONID cookie的方法将无法工作。
我们希望使用OAuth2来保护我们的新微服务,这意味着它们将需要有效的访问令牌来处理所有传入请求。

问题

我们找到的所有文档和示例都与实现标准解决方案有关,通过这些解决方案,您可以选择要使用的OAuth2授权流(隐式或PKCE授权代码),并让SPA提示用户进行身份验证。
这对我们来说是行不通的,因为我们仍然处于这种混合的情况下,所有的用户身份验证都是由传统的webapp处理的。

  • 在这种情况下,人们会使用哪些方法?
  • 如何在加载SPA时为其提供足够的信息,以便对新的微服务API进行(预)身份验证调用?

我们很乐意考虑将传统的webapps登录流程转移到基于OAuth的流程,但仍然不清楚如何解决SPA的问题。

wlzqhblo

wlzqhblo1#

如果您的所有应用程序都是OAuth2,那么您可能会选择OIDC授权服务器,并且几乎所有应用程序都具有SSO(单点登录)功能:当用户认证(利用授权码+ PKCE流)时,他们具有在授权服务器上打开的“会话”,并且可以使随后的认证静默地发生(只有每个客户端的第一认证可以要求明确的同意)。
换句话说,使用SSO,您的用户只需对所有客户端(旧应用程序和新Vue应用程序)进行一次身份验证。
确保为每个客户机框架选择Certified OpenID Connect Implementations

zaq34kh6

zaq34kh62#

除了前面的答案之外,OIDC也是正确的选择,因为您仍然可以拥有将在OIDC流程中创建的用户会话:https://openid.net/connect/
在OIDC流id令牌中,返回访问令牌和刷新令牌,但id令牌只使用一次来建立用户会话。
访问令牌和刷新令牌可以保存在负责OIDC通信和用户会话创建的后台服务(即某个网关)上,然后根据用户会话查找这些令牌,并在需要时用于调用微服务。
理解Oauth背后的整个概念是很重要的,尤其是在Web应用程序的场景中。我建议阅读这些信息以了解全貌:https://www.ietf.org/archive/id/draft-ietf-oauth-browser-based-apps-10.html

相关问题