我正在尝试使用spring-boot-starter-oauth2-client
来获取承载令牌,其中服务正在接受grant_type=client_credentials
但不能authorization-grant-type
。
curl -s -X POST -H "Content-Type: application/x-www-form-urlencoded" -u theusername:thepassword "https://thirdpartyservice.com/token?scope=resolve+download&grant_type=client_credentials" | jq -r '.access_token'
这会起作用,我们能够获得令牌。
按照 Spring Security 的文档,我正在配置:
spring:
application:
name: client-application
security:
oauth2:
client:
registration:
my-client:
provider: the-provider
client-id: theusername
client-secret: thepassword
authorization-grant-type: client_credentials
#grant_type: client_credentials
scope: resolve+download
provider:
the-provider:
token-uri: https://thirdpartyservice.com/token
logging:
level:
root: DEBUG
@Configuration
public class RestClientConfig {
@Bean
public RestClient restClient(OAuth2AuthorizedClientManager authorizedClientManager) {
OAuth2ClientHttpRequestInterceptor interceptor = new OAuth2ClientHttpRequestInterceptor(authorizedClientManager);
return RestClient.builder()
.requestInterceptor(interceptor)
.build();
}
}
return restClient.get()
.uri("https://resource...")
.attributes(clientRegistrationId("my-client"))
.retrieve()
.body(String.class);
不幸的是,这不起作用,令牌提供者返回 400 错误,因为它是预期的grant_type
(授予下划线类型)。
但似乎 Spring Security 只提供“授权授予类型”
如何grant_type
使用RestClient
和传递spring-boot-starter-oauth2-client
?
在 YAML 中,
scope
应该是一个 (YAML) 值列表:这些值将变成以空格分隔的字符串,并以空格编码为
+
,就像在您的工作 curl 请求中一样。提醒一下,在 application.yml 中,列表要么像上面一样用虚线表示,要么用逗号分隔。