Spring Cloud Gateway 令牌中继:谁是 OAuth2 客户端?

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

我正在探索 Spring Cloud Gateway 的 TokenRelay 过滤器,以便在 SAML2 会话和 OAuth2 令牌之间进行调解(更多信息请参见我之前的问题此处)。

我自己尝试解决这个问题,但我似乎无法解决:使用此过滤器,谁是 OAuth2 客户端

我希望这是网关本身,因此是一个机密的..但在我的初始设置中,我看到浏览器中对授权代码的调用,我不明白这是否是预期的行为。

如果确实是这样工作的并且浏览器执行了令牌交换,这是否意味着客户端不能保密?我应该切换到 PKCE 吗?

我可能听起来有点困惑(我真的很困惑!)但我似乎找不到太多关于此事的信息。

谢谢!

spring oauth-2.0 spring-cloud-gateway
1个回答
3
投票

我会区分:

  • 用户代理:在您的情况下是浏览器,但它可以是移动应用程序,或者带有 HTTP 客户端的任何应用程序
  • OAuth2 客户端:从授权服务器获取令牌并将使用承载访问令牌授权的请求发送到资源服务器(或在网关的情况下转发)的代码

将单页和移动应用程序配置为公共 OAuth2 客户端时,OAuth2 客户端在用户代理内部运行,因此很难区分。这也有安全隐患,但不是这里的主题(令牌端点无法用秘密保护,并且令牌会暴露给 Javascript 代码,因此会受到 XSS 攻击)。

当在后端配置具有授权代码和刷新令牌流的 OAuth2 客户端(Spring Security DSL 中的

oauth2Login
)时,可以使用密钥(如果我们挑剔的话还可以使用防火墙规则)保护令牌端点,并且令牌是安全地保存在服务器上。在这种情况下,用户代理和 OAuth2 客户端之间的区别很明显。

让我们回顾一下授权代码流程如何工作并考虑到这种区别:

  1. 用户代理重定向到 OAuth2 客户端授权端点(Spring Security 默认情况下
    /oauth2/authorization/{registration-id}
  2. OAuth2 客户端确保用户代理存在会话(如果尚不存在则设置 cookie),设置一些安全参数,并将用户代理重定向到授权服务器授权端点
  3. 授权服务器运行它配置的任何识别流(登录表单可能包括多因素内容、记住我 cookie、魔术链接等)。当用户成功通过身份验证时,授权服务器将用户代理重定向到带有授权码的 OAuth2 客户端(Spring Security 默认情况下
    /login/oauth2/code/{registration-id}
  4. OAuth2 客户端将代码交换为令牌。 这是 OAuth2 客户端和授权服务器之间的直接通信。因此,当客户端在后端运行时,用户代理不参与其中。 获得令牌后,OAuth2 客户端可以将其状态更改为 “已授权” 并将用户代理重定向到 “登录后” “路线。

在 BFF 模式中,唯一的 OAuth2 客户端是 BFF 本身(在您的情况下是 spring-cloud-gateway),但在授权代码流中,用户使用其用户代理进行身份验证(最常见的是用于登录表单的系统浏览器,但也可能是其他用于生物识别或多因素身份验证的应用程序)。但是,授权服务器应仅将授权代码发送给声明的客户端:BFF(不是浏览器中的富应用程序),它将使用它来获取 OAuth2 令牌。

=> 使用 OAuth2 BFF 模式,浏览器是将授权代码从授权服务器传输到网关的容器,但它永远不会看到 OAuth2 令牌。

编辑

我在 Baeldung 上发布了一个 教程,用于使用 oauth2Login

TokenRelay
 过滤器将 Spring Cloud Gateway 配置为 OAuth2 BFF
。它包含 Angular、React (Nex.js) 和 Vue 的示例实现。

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