Oauth2.0认证流程问题

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

我正在努力解决有关 Oauth2 身份验证流程的设计问题。 一点背景知识:我们正在使用 React 开发一个客户端,并使用 java (spring boot) 开发一个后端。只有使用 oauth2 服务器(例如托管在我们的 AWS 中的 keycloak)进行基于 oauth2 的登录。

现在解决问题:

由于我们使用 REST,因此使用无状态方法,因此客户端似乎能够向 keycloak 发出任何 Oauth2 请求。这会导致安全问题,至少在我看来是这样。当客户端从 keycloak 中获取代码,以及稍后 keycloak 的令牌(可以在我们整个公司用作 sso)时,令牌将非常容易获取。我希望在后端看到 Oauth2 请求,因为后端将提供另一个 JWT 令牌,仅用于客户端和服务器之间的基本通信..

那么问题来了,有没有更安全的方式来处理oauth2?后端无法触发前端中的任何内容(无状态和异步)。

security oauth-2.0
1个回答
0
投票

答案是“是的,有更安全的方法来处理 oauth2” <:oD

为了更具建设性,最近一种非常流行的模式称为 Backend FFrontend ,它正是您所寻找的。

其工作原理如下:

  • 在您的服务器(BFF)上设置中间件
  • 将 BFF 配置为 OAuth2 客户端
  • BFF 为前端保留会话:浏览器和 BFF 之间的请求通过
    secured
    (仅通过 https 交换)、
    http-only
    (Javascript 代码无法读取)以及理想情况下的
    same-site
    会话 cookie 进行授权。它还应该防止 CSRF 攻击(Javascript 代码可以访问 CSRF 令牌,其值作为
    X-XSRF-TOKEN
    标头返回到
    POST
    /
    PUT
    /
    DELETE
    请求)。
  • BFF 处理登录、注销和令牌存储(通常在会话中)
  • BFF 在将请求从前端转发到资源服务器之前,会用
    Bearer
    访问令牌替换动态会话 cookie。

这解决了两个安全问题:

  • 在您信任的服务器上运行的 OAuth2 客户端可以使用秘密并成为“机密”客户端:移动应用程序或浏览器中基于 Javascript 的应用程序都无法保守秘密,并且必须配置为“公共”客户端,这意味着任何人欺骗用户获取授权代码可以将其转化为令牌(访问、ID 和刷新)
  • 令牌保存在服务器上(由 BFF),并且永远不会暴露给 Javascript 代码,甚至不会暴露给浏览器(同样,用于授权请求的会话 cookie 本身应该无法被 Javascript 代码访问)。

当您使用 React 和 Spring 时,我看到两个自然的选择:

  • 使用 Next.js OAuth,其中 OAuth2 客户端是应用程序的节点部分(在服务器上)
  • 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 前端参考这个其他项目,但它只是暂时在线,并且自述文件是法语的。

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