In spring-security-oauth2:2.4.0.RELEASE
classes such as OAuth2RestTemplate
, OAuth2ProtectedResourceDetails
and ClientCredentialsAccessTokenProvider
have all been marked as deprecated.
从这些类的 javadoc 中,它指向一个 spring security 迁移指南,暗示人们应该迁移到核心 spring-security 5 项目。但是,我无法找到如何在此项目中实现我的用例。
如果您希望对应用程序的传入请求进行身份验证并且希望使用第 3 方 OAuth 提供程序来验证身份,则所有文档和示例都会讨论与第 3 部分 OAuth 提供程序集成。
在我的用例中,我想做的就是使用 RestTemplate
向受 OAuth 保护的外部服务发出请求。目前,我创建了一个 OAuth2ProtectedResourceDetails
以及我传递给 OAuth2RestTemplate
的客户端 ID 和密码。我还有一个自定义 ClientCredentialsAccessTokenProvider
添加到 OAuth2ResTemplate
只是向我正在使用的 OAuth 提供程序所需的令牌请求添加一些额外的标头。
在 spring-security 5 文档中,我找到了一个部分,其中提到 了自定义令牌请求,但同样看起来是在使用第三方 OAuth 提供程序对传入请求进行身份验证的上下文中。目前尚不清楚如何将它与类似 ClientHttpRequestInterceptor
的东西结合使用,以确保每个对外部服务的传出请求首先获得一个令牌,然后将其添加到请求中。
同样在上面链接的迁移指南中,有对 OAuth2AuthorizedClientService
的引用,它说它对在拦截器中使用很有用,但这看起来又依赖于 ClientRegistrationRepository
之类的东西,它似乎如果您想使用该提供来确保传入请求经过身份验证,请在它维护第三方提供商注册的地方。
有什么方法可以利用 spring-security 5 中的新功能来注册 OAuth 提供程序,以便获取令牌以添加到我的应用程序的传出请求中?
原文由 Matt Williams 发布,翻译遵循 CC BY-SA 4.0 许可协议
Spring Security 5.2.x 的 OAuth 2.0 客户端特性不支持
RestTemplate
,只支持 ---WebClient
。请参阅 Spring 安全参考:此外,
RestTemplate
将在未来版本中弃用。请参阅 RestTemplate javadoc :因此,最好的解决方案是放弃
RestTemplate
支持WebClient
。使用
WebClient
客户端凭证流以编程方式或使用 Spring Boot 自动配置配置客户端注册和提供程序:
… 和
OAuth2AuthorizedClientManager
@Bean
:配置
WebClient
实例以使用ServerOAuth2AuthorizedClientExchangeFilterFunction
提供的OAuth2AuthorizedClientManager
:现在,如果您尝试使用此
WebClient
实例发出请求,它将首先从授权服务器请求令牌并将其包含在请求中。