OAuth2 Предоставление пароля Spring Serurity - PullRequest
0 голосов
/ 24 марта 2020

У меня проблемы с настройкой паспорта. Мне нужно сделать POST-запрос «auth» с именем пользователя и паролем (basi c auth) и вернуть токен в ответ. Что у меня согласно https://docs.spring.io/spring-security/site/docs/current/reference/html5/#oauth2Client -password-grant :

spring:
  security:
    oauth2:
      client:
        registration:
          lol:
            client-id:lol
            client-secret: lol
            client-authentication-method: basic
            authorization-grant-type: password
            accessTokenUri: http://lol/token
        provider:
          lol:
            token-uri: lol/token

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {


        http
                .anyRequest().authenticated()
                .and()
                .httpBasic()
                .and()
                .exceptionHandling()
                .and()
                .oauth2Client()

    }



    @Bean
    public OAuth2AuthorizedClientManager passwordFlowAuthorizedClientManager(
            ClientRegistrationRepository clientRegistrationRepository,
            OAuth2AuthorizedClientRepository authorizedClientRepository
    ) {
        DefaultPasswordTokenResponseClient passwordTokenResponseClient = new DefaultPasswordTokenResponseClient();

        RestTemplate restTemplate = new RestTemplate();
        restTemplate.setMessageConverters(Arrays.asList(
                new FormHttpMessageConverter(),
                new OAuth2AccessTokenResponseHttpMessageConverter()
        ));
        restTemplate.setErrorHandler(new OAuth2ErrorResponseErrorHandler());
        passwordTokenResponseClient.setRestOperations(restTemplate);

        OAuth2AuthorizedClientProvider authorizedClientProvider =
                OAuth2AuthorizedClientProviderBuilder.builder()
                        .password()
                        .build();

        DefaultOAuth2AuthorizedClientManager authorizedClientManager =
                new DefaultOAuth2AuthorizedClientManager(
                        clientRegistrationRepository, authorizedClientRepository);
        authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider);

        authorizedClientManager.setContextAttributesMapper(authorizeRequest -> {
            Map<String, Object> contextAttributes = new HashMap<>();
            String username = authorizeRequest.getAttribute(OAuth2ParameterNames.USERNAME);
            String password = authorizeRequest.getAttribute(OAuth2ParameterNames.PASSWORD);
            if (StringUtils.hasText(username) && StringUtils.hasText(password)) {
                contextAttributes = new HashMap<>();

                // `PasswordOAuth2AuthorizedClientProvider` requires both attributes
                contextAttributes.put(OAuth2AuthorizationContext.USERNAME_ATTRIBUTE_NAME, username);
                contextAttributes.put(OAuth2AuthorizationContext.PASSWORD_ATTRIBUTE_NAME, password);
            }
            return contextAttributes;
        });

        return authorizedClientManager;
    }

    @Bean
    WebClient webClient(OAuth2AuthorizedClientManager authorizedClientManager) {
        ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2Client =
                new ServletOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager);
        return WebClient.builder()
                .apply(oauth2Client.oauth2Configuration())
                .build();
    }
}

Когда у меня есть GET http://localhost: 8080 / oauth2 / авторизация / -> 401 И DefaultPasswordTokenResponseClient инициализирован, у меня "Не найден поставщик проверки подлинности для" UsernamePasswordAuthentificationToken "".

Но я полагаю, что это PasswordOAuth2AuthorizedClientProvider.

И ничего не работает / И я не знаю, что мне с этим делать. Что не так? Спасибо

...