Мне нужно получить токен oauth2 для добавления в заголовок запроса.
Я хочу загрузить регистрацию Oauth2 через OAuth2AuthorizedClient
из OAuth2AuthorizedClientService
.
OAuth2AuthorizedClient
Я считаю, что должен быть настроен / доступен, использует client_credentials, поэтому есть clientRegistrationId
, но нет principalName
.
Я что-то в корне неправильно понимаю?
IРанее я получал токен Oauth, используя более «ручной» подход, когда я строил OAuth2ClientCredentialsGrantRequest
вручную.Я не думаю, что я должен был бы построить OAuth2ClientCredentialsGrantRequest
сам, хотя:
// What I WAS doing...
@RequiredArgsConstructor
@Slf4j
class JestOAuth2RequestInterceptor implements HttpRequestInterceptor {
private final ClientRegistrationRepository clientRegistrationRepository;
private final OAuth2AccessTokenResponseClient<OAuth2ClientCredentialsGrantRequest> oAuth2AccessTokenResponseClient;
@Override
public void process(HttpRequest request, HttpContext context) throws HttpException, IOException {
ClientRegistration registration = this.clientRegistrationRepository
.findByRegistrationId("elasticsearch);
// I don't think this is the best way to do things...?
OAuth2ClientCredentialsGrantRequest grantRequest = new OAuth2ClientCredentialsGrantRequest(registration);
OAuth2AccessTokenResponse response = oAuth2AccessTokenResponseClient.getTokenResponse(grantRequest);
OAuth2AccessToken token = response.getAccessToken();
request.addHeader("Authorization", String.format("Bearer %s", token.getTokenValue()));
}
}
Но у меня сложилось впечатление, что я должен быть в состоянии использовать OAuth2AuthorizedClientService
, чтобы загрузить это как OAuth2AuthorizedClient
и получите токен следующим образом:
// What I think I should be able to do:
@Slf4j
@RequiredArgsConstructor
class JestOAuth2RequestInterceptor implements HttpRequestInterceptor {
private final OAuth2AuthorizedClientService oAuth2AuthorizedClientService;
@Override
public void process(HttpRequest request, HttpContext context) throws HttpException, IOException {
// "principalName" is null because we're using client_credentials grant flow, so
// there isn't a Principal associated to the client
OAuth2AuthorizedClient authorizedClient = oAuth2AuthorizedClientService
.loadAuthorizedClient("elasticsearch", null);
request.addHeader("Authorization",
String.format("Bearer %s", authorizedClient.getAccessToken().getTokenValue()));
}
}
Наконец, мой application.yml будет выглядеть так:
spring:
security:
oauth2:
client:
provider:
myprovider:
authorization-uri: ${identity.auth_domain}/oauth/authorize
token-uri: ${identity.auth_domain}/oauth/token
user-info-uri: ${identity.auth_domain}/userinfo
jwk-set-uri: ${identity.auth_domain}/token_keys
registration:
elasticsearch:
client-name: myclientname
client-id: myid
client-secret: mysecret
provider: myprovider
authorization-grant-type: client_credentials
redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}'
При использовании OAuth2AuthorizedClient authorizedClient = oAuth2AuthorizedClientService.loadAuthorizedClient("elasticsearch", null);
я получаю следующее исключение:
java.lang.IllegalArgumentException: principalName cannot be empty
at org.springframework.util.Assert.hasText(Assert.java:284) ~[spring-core-5.1.4.RELEASE.jar!/:5.1.4.RELEASE]
at org.springframework.security.oauth2.client.InMemoryOAuth2AuthorizedClientService.loadAuthorizedClient(InMemoryOAuth2AuthorizedClientService.java:55
Из OAuth2AuthorizedClient API
вы увидите, что OAuth2AuthorizedClient
нельзя создать с principalName
как нулевым ... Но так как это грант client_credentials,разве нет никакого принципала, связанного с этим вообще?
https://github.com/spring-projects/spring-security/blob/master/oauth2/oauth2-client/src/main/java/org/springframework/security/oauth2/client/OAuth2AuthorizedClient.java#L72
НО, ссылка Spring Security создает впечатление, что я должен быть в состоянии связать OAuth2AuthorizedClient с регистрацией client_credentialsТип.
https://docs.spring.io/spring-security/site/docs/current/reference/html5/#oauth2Client-registered-authorized-client
Я совершенно не понимаю здесь что-то?Спасибо за ваше время.
(Использование Spring Boot 2.1.2, Spring Security 5.1.x)