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