Какой основной идентификатор связан с OAuth2AuthorizedClient, настроенным с помощью client_credentials? - PullRequest
0 голосов
/ 31 января 2019

Мне нужно получить токен 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...