免责声明:老实说,我尝试在 google/github 上搜索,扫描了OAuth2 迁移指南,但找不到答案,所以我们开始吧。
来自 spring-cloud-security 项目的org.springframework.cloud.security.oauth2.client.feign.OAuth2FeignRequestInterceptor获取 OAuth2 令牌并将其设置为对客户端调用者透明的 Feign 的 RequestTemplate。
但是,它依赖于已弃用的OAuth2ClientContext类,该类引用了前面提到的迁移指南,该指南仍然说
对于其他流,需要构造和公开 OAuth2ClientContext 实例。
所以知道几件事会很好:
1.它真的被弃用了,或者只是它的用法应该改变(至少在某些情况下)?
2. 如果是前者 - 正确的选择是什么?
3. 是否有计划OAuth2FeignRequestInterceptor从使用已弃用的类迁移?
我正在尝试从 Feign 客户端应用程序调用一些由 client_credentials 授权类型保护的后端系统。
可以使用以下 curl 结构检索来自后端系统的访问令牌(仅作为示例):
curl --location --request POST '[SERVER URL]/oauth/grant' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Cookie: WebSessionID=172.22.72.1.1558614080219404; b8d49fdc74b7190aacd4ac9b22e85db8=2f0e4c4dbf6d4269fd3349f61c151223' \
--data-raw 'grant_type=client_credentials' \
--data-raw 'client_id=[CLIENT_ID]' \
--data-raw 'client_secret=[CLIENT_SECRET]'
{"accessToken":"V29C90D1917528E9C29795EF52EC2462D091F9DC106FAFD829D0FA537B78147E20","tokenType":"Bearer","expiresSeconds":7200}
Run Code Online (Sandbox Code Playgroud)
然后应将此 accessToken 设置在标头中,以用于对后端系统的后续业务调用。
所以现在我的问题是,如何使用 Feign 和 Spring Boot Security 5 来实现这一点。 经过一些研究,我找到了这个解决方案(不起作用):
spring:
security:
oauth2:
client:
registration:
backend:
client-id:[CLIENT_ID]
client-secret: [CLIENT_SECRET]
authorization-grant-type: client_credentials
provider:
backend:
token-uri: [SERVER URL]/oauth/grant
Run Code Online (Sandbox Code Playgroud)
curl --location --request POST '[SERVER URL]/oauth/grant' \
--header 'Content-Type: application/x-www-form-urlencoded' …Run Code Online (Sandbox Code Playgroud) 我有一个自动连接许多服务的控制器。这些服务是 HTTP Restful 调用,从各种数据源检索数据,但这些服务受 OAuth2.0 保护。
我正在尝试使用 Spring Security 来实现客户端凭据流,该流将允许这些服务安全地从这些受保护的数据源检索数据,但在解析服务层的 OAuth2AuthorizedClient 数据对象时遇到一些困难。
我一直在尝试通过 @RegisteredOAuth2AuthorizedClient注释解析授权客户端:
public void setAuthorizedClient(
@RegisteredOAuth2AuthorizedClient("azure") OAuth2AuthorizedClient authorizedClient) {
ClientRegistration clientRegistration =
this.clientRegistrationRepository.findByRegistrationId("azure");
System.out.println(clientRegistration);
OAuth2AccessToken accessToken = authorizedClient.getAccessToken();
jwtToken = accessToken.getTokenValue();
}
Run Code Online (Sandbox Code Playgroud)
是否可以将OAuth2AuthorizedClient解析为 Spring bean,然后将其注入到另一个 bean 中?
或者有更好的方法来构建这样的系统吗?
谢谢!
在我们最后的伪装客户端安全配置中,我们有这个 Bean:
@Bean
public RequestInterceptor oauth2FeignRequestInterceptor(
ClientCredentialsResourceDetails oauth2RemoteResource) {
return new OAuth2FeignRequestInterceptor(
new DefaultOAuth2ClientContext(),
oauth2RemoteResource
);
}
Run Code Online (Sandbox Code Playgroud)
在 2.3 spring 版本中OAuth2FeignRequestInterceptor已弃用!但是我们找不到新的。
有人知道吗?