我正在探索 Spring Cloud Gateway 的 TokenRelay 过滤器,以便在 SAML2 会话和 OAuth2 令牌之间进行调解(更多信息请参见我之前的问题此处)。
我自己尝试解决这个问题,但我似乎无法解决:使用此过滤器,谁是 OAuth2 客户端?
我希望这是网关本身,因此是一个机密的..但在我的初始设置中,我看到浏览器中对授权代码的调用,我不明白这是否是预期的行为。
如果确实是这样工作的并且浏览器执行了令牌交换,这是否意味着客户端不能保密?我应该切换到 PKCE 吗?
我可能听起来有点困惑(我真的很困惑!)但我似乎找不到太多关于此事的信息。
谢谢!
我会区分:
将单页和移动应用程序配置为公共 OAuth2 客户端时,OAuth2 客户端在用户代理内部运行,因此很难区分。这也有安全隐患,但不是这里的主题(令牌端点无法用秘密保护,并且令牌会暴露给 Javascript 代码,因此会受到 XSS 攻击)。
当在后端配置具有授权代码和刷新令牌流的 OAuth2 客户端(Spring Security DSL 中的
oauth2Login
)时,可以使用密钥(如果我们挑剔的话还可以使用防火墙规则)保护令牌端点,并且令牌是安全地保存在服务器上。在这种情况下,用户代理和 OAuth2 客户端之间的区别很明显。
让我们回顾一下授权代码流程如何工作并考虑到这种区别:
/oauth2/authorization/{registration-id}
)/login/oauth2/code/{registration-id}
)在 BFF 模式中,唯一的 OAuth2 客户端是 BFF 本身(在您的情况下是 spring-cloud-gateway),但在授权代码流中,用户使用其用户代理进行身份验证(最常见的是用于登录表单的系统浏览器,但也可能是其他用于生物识别或多因素身份验证的应用程序)。但是,授权服务器应仅将授权代码发送给声明的客户端:BFF(不是浏览器中的富应用程序),它将使用它来获取 OAuth2 令牌。
=> 使用 OAuth2 BFF 模式,浏览器是将授权代码从授权服务器传输到网关的容器,但它永远不会看到 OAuth2 令牌。
我在 Baeldung 上发布了一个 教程,用于使用 oauth2Login
和
TokenRelay
过滤器将 Spring Cloud Gateway 配置为 OAuth2 BFF。它包含 Angular、React (Nex.js) 和 Vue 的示例实现。