如何将单页 React 应用程序与支持 OAuth2 的 spring-boot webflux 后端集成

问题描述 投票:0回答:1

我有一个支持 OAuth2 (spring boot 3.2 和 spring security 6.2)的 spring-boot webflux 应用程序。这与 Swagger UI 和 API 很好地集成。但是,我现在想支持单页 React 应用程序,并且不确定如何将登录流程与 React 应用程序集成并让后端处理 oauth2。

我目前正在使用 kubernetes 部署后端。我还为前端部署了一个单独的容器,它只是为静态单页 React 应用程序提供服务的 nginx。我将入口配置为将任何内容从根路由到前端 React 应用程序,并将任何内容路由到 /api 到后端 spring-boot 应用程序。

  1. 我的反应应用程序应调用以启动登录流程的正确端点是什么?这将是用户单击登录的按钮。鉴于我的后端使用

    /api/v1
    的基本路径前缀,那是
    {baseUrl}/api/v1/oauth2/authorization/{registrationId}

  2. 登录完成后如何让它重定向回我的 React 应用程序?对于通过 swagger 的典型流程,访问受限端点将自动启动流程,并且它知道重定向回被调用的原始端点。然而,使用 React 应用程序,我们有意尝试启动登录(以获取用户信息和 cookie),因此后端不知道要重定向回哪个 url。

  3. 有推荐的react库可以处理流程吗?

我已经尝试了上面的 URL,但是,响应是 302,位置为授权服务器

{authServerUrl}/oauth2/authorize?response_type=code&client_id=<client_id>&scope=accountname%20groups%20openid%20profile&state=<code>&redirect_uri={baseUrl}/api/v1/login/oauth2/code/appleconnect&nonce=<code>

我需要在react-app 中处理重定向吗?有没有办法连接到 spring-boot 后端 oauth2 流程来处理所有这些?或者我是否需要从react-app中处理它,因为我需要直接保留来自auth服务器的用户信息并保留ID令牌以在调用后端时设置cookie?

reactjs spring-boot spring-security-oauth2
1个回答
0
投票

后端的资源服务器将需要访问令牌(而不是 ID 令牌),建议不要使用访问令牌来授权单页(或移动)应用程序和后端之间的请求。您应该使用会话(以及针对 CSRF 的保护)来授权这些请求。

如果将 React 与 Next 一起使用,您可以选择使用 NextAuth.js,它使用前端和服务器上运行的机密 OAuth2 客户端(Node 实例)之间的会话。节点服务器将令牌保留在会话中,并在将请求转发到 REST API 之前用 Bearer 标头替换会话 cookie。从 OAuth2 的角度来看,这是一个令人满意的解决方案,但它可能不像使用 Spring Cloud Gateway 实例那样容易扩展和监控。

无论前端框架是什么(Angular、Vue、React、Flutter...),您都可以将 BFF(前端后端)设置为机密 OAuth2 客户端,并使用以下方式在会话和令牌之间桥接:

  • spring-cloud-gateway
  • spring-boot-starter-oauth2-client
  • TokenRelay=
    过滤器

在这种情况下,前端不需要任何库,您所要做的就是处理会话和 CSRF cookie。但是,由于浏览器已经为您处理会话 cookie,并且 Angular 和 React 透明地处理 CSRF 令牌,因此在您的情况下,无需做太多事情。

我在 Baeldung 上写了一个 完整教程

© www.soinside.com 2019 - 2024. All rights reserved.