我正在努力解决有关 Oauth2 身份验证流程的设计问题。 一点背景知识:我们正在使用 React 开发一个客户端,并使用 java (spring boot) 开发一个后端。只有使用 oauth2 服务器(例如托管在我们的 AWS 中的 keycloak)进行基于 oauth2 的登录。
现在解决问题:
由于我们使用 REST,因此使用无状态方法,因此客户端似乎能够向 keycloak 发出任何 Oauth2 请求。这会导致安全问题,至少在我看来是这样。当客户端从 keycloak 中获取代码,以及稍后 keycloak 的令牌(可以在我们整个公司用作 sso)时,令牌将非常容易获取。我希望在后端看到 Oauth2 请求,因为后端将提供另一个 JWT 令牌,仅用于客户端和服务器之间的基本通信..
那么问题来了,有没有更安全的方式来处理oauth2?后端无法触发前端中的任何内容(无状态和异步)。
答案是“是的,有更安全的方法来处理 oauth2” <:oD
为了更具建设性,最近一种非常流行的模式称为 Backend F或 Frontend ,它正是您所寻找的。
其工作原理如下:
secured
(仅通过 https 交换)、http-only
(Javascript 代码无法读取)以及理想情况下的 same-site
会话 cookie 进行授权。它还应该防止 CSRF 攻击(Javascript 代码可以访问 CSRF 令牌,其值作为 X-XSRF-TOKEN
标头返回到 POST
/ PUT
/ DELETE
请求)。Bearer
访问令牌替换动态会话 cookie。这解决了两个安全问题:
当您使用 React 和 Spring 时,我看到两个自然的选择:
spring-cloud-gateway
与 spring-boot-starter-oauth2-client
和 TokenRelay=
过滤器我个人倾向于第二种选择,我认为它更具可扩展性和更多价性(会话可以使用 spring-session 在实例之间共享,它可以与服务器上没有节点部分的 React 应用程序一起使用,也可以与 Angular 或Vue 应用程序等)。
我编写了一个教程,用于 将
spring-cloud-gateway
配置为 BFF。它是用 Angular 编写的,但由于前端所需要做的就是 setting window.location.href
来触发登录,因此您应该能够将其移植到 React。您还可以使用 Next.js 前端参考这个其他项目,但它只是暂时在线,并且自述文件是法语的。