SPA 和简单后端与 Oauth2 同源 - 使用 http 会话的方式

SPA and simple backend on same origin with Oauth2 - way to use http session

使用简单的后端(例如 Spring)和 SPA 前端和 OAuth2 身份验证提供程序,基于 http 会话实现授权的正确方法是什么?

术语 "correct" 我的意思是一种模拟用户到后端以获取会话 cookie 的方法。

不幸的是,到处都是 "scallable, restful, stateless" JWT 炒作。但是我的应用程序将被很少的用户使用,它只需要开箱即用的 http 会话提供的普通旧的良好安全性。 Okta 解决方案的当前 "proposed" 导致每个请求都 API 被验证,因此每个调用都有很大的开销,从而导致性能不佳。

假设我们在 myapp.com 上公开了 SPA 应用,其后端通过 myapp.com/api.

在代理上公开

我想到的是这个场景的实现:

  1. 用户访问 SPA(Angular、React 等)
  2. SPA 调用后端获取用户详细信息,403
  3. SPA 正在重定向到 oauth 提供商,例如。奥克塔
  4. 用户登录到 oauth 提供商
  5. oauth 提供者授予不记名令牌并重定向回 SPA
  6. SPA 调用后端获取用户详细信息,但现在使用承载
  7. spring 接收 oauth2 授予的令牌,在 oauth 提供程序中对此进行验证,创建 http 会话并授予会话 cookie (JSESSIONID)
  8. 对后端的 SPA 调用会自动填充 cookie(我们正在与代理对话,所以它是同一个域)

或者也许:

  1. 用户访问 SPA(Angular、React 等)
  2. SPA 调用后端获取用户详细信息,403,因此后端正在重定向到 oauth 提供程序,例如。奥克塔
  3. 用户登录到 oauth 提供商
  4. oauth 使用 oauth2 令牌重定向回后端
  5. spring 接收 oauth2 授予的令牌,在 oauth 提供程序中对此进行验证,创建 http 会话并授予会话 cookie (JSESSIONID),然后重定向到 SPA
  6. SPA 调用后端获取用户详细信息(自动填充 cookie),200

是否有开箱即用的可用配置?看起来这两种情况都需要在 spring 安全方面进行大量工作和配置。遗憾的是,很难找到任何与结合了 SPA 和 oauth2 提供程序的 http 会话 cookie 相关的资源。

或者我遗漏了什么?

JHipster 实现了(更安全的)第二种场景(也称为授权代码流)。它的实现基于 Spring Security 的 OAuth 支持。

我们已经使用 Keycloak 和 Okta 测试了所有内容,但它应该可以与任何符合 OIDC 标准的 IdP 一起使用。

http://www.jhipster.tech