Estou tentando usar spring-boot-starter-oauth2-client
para obter um token portador, onde o serviço está aceitando grant_type=client_credentials
e não 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'
Isso funcionaria, se pudéssemos obter o token.
Seguindo a documentação sobre Spring Security, estou configurando:
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);
Infelizmente, isso não está funcionando. O provedor de token retorna o erro 400, como esperado grant_type
(tipo de concessão de sublinhado).
Mas parece que o Spring Security oferece apenas "autorização-concessão-tipo"
Como passar grant_type
usando RestClient
e spring-boot-starter-oauth2-client
?
Em YAML,
scope
deve haver uma lista (YAML) de valores:Os valores serão transformados em uma string delimitada por espaços e codificados por espaços como
+
, assim como na sua solicitação curl de trabalho.Como lembrete, em application.yml, as listas são tracejadas como acima ou separadas por vírgulas.