Как установить учетные данные для предоставления пароля для OAuth 2.0? - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь настроить экземпляр Spring WebClient для использования аутентификации OAuth 2.0 с типом предоставление пароля , но я не уверен, как правильно установить имя пользователя и пароль.

В моем приложении соответствующие параметры принимаются в виде Map<String, String> и не загружаются из какого-либо файла application.yaml. По этой причине я пытаюсь сделать это программно (т. Е. Без использования bean-компонентов) - мой подход может быть неправильным с самого начала.

Это мое нерабочее решение:

{
    OAuth20Info oAuth20Info = (OAuth20Info) parameters.getAuthenticationInfo();

    ClientRegistration registration = ClientRegistrations.fromOidcIssuerLocation(oAuth20Info.getHost() + ":" + oAuth20Info.getPort()) // host, port
        .clientId(oAuth20Info.getClientId()) // clientId
        .tokenUri(oAuth20Info.getTokenUrlPath()) // tokenUrlPath
        .authorizationGrantType(AuthorizationGrantType.PASSWORD) // grantType
        // TODO: How to set: username, password?
        .build();

    ReactiveClientRegistrationRepository clientRegistrations = new InMemoryReactiveClientRegistrationRepository(registration);

    ServerOAuth2AuthorizedClientExchangeFilterFunction oauth =
        new ServerOAuth2AuthorizedClientExchangeFilterFunction(
            clientRegistrations,
            new UnAuthenticatedServerOAuth2AuthorizedClientRepository());

    return WebClient.builder().filter(oauth).build();
}

Следовательно, я не знаю, где мне нужно установить имя пользователя и пароль. В соответствии с this : «В новейшей наилучшей текущей практике безопасности OAuth 2.0 запрещается предоставление пароля полностью», поэтому я не уверен, поддерживается ли он вообще.

Я ожидал, что смогу установить имя пользователя и пароль в компоновщике для экземпляра ClientRegistration, но это невозможно.

Итак, как я могу установить значения имени пользователя и пароля для доступа к некоторому защищенному ресурсу с учетными данными типа предоставления пароля? Заранее спасибо.

Соответствующая часть моих зависимостей:

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webflux</artifactId>
  <version>5.2.3.RELEASE</version>
</dependency>
<dependency>
  <groupId>io.projectreactor.netty</groupId>
  <artifactId>reactor-netty</artifactId>
  <version>0.9.4.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>5.1.7.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>5.1.7.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework.security</groupId>
  <artifactId>spring-security-oauth2-client</artifactId>
  <version>5.2.2.RELEASE</version>
</dependency>
<dependency>
  <groupId>org.springframework.security.oauth</groupId>
  <artifactId>spring-security-oauth2</artifactId>
  <version>2.3.7.RELEASE</version>
</dependency>
<dependency>

1 Ответ

0 голосов
/ 06 апреля 2020

Вы можете попробовать:

        WebClient.builder()
            .filter(ExchangeFilterFunctions
                .basicAuthentication(configuration.getClientId(), configuration.getClientSecret()))
            .build()
            .post()
            .uri(...)
            ...

Вы можете использовать класс ExchangeFilterFunctions для добавления заголовка авторизации к запросу.

Другой способ:

        WebClient.builder()
            .defaultHeaders(header -> header.setBasicAuth(userName, password))
            ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...