Spring Security OAuth2 Credentiais через заголовок - PullRequest
0 голосов
/ 01 июля 2019

Итак, я создаю Сервер авторизации с помощью Spring Security OAuth Project, это мой класс configurer:

@Configuration
public class AuthConfig extends AuthorizationServerConfigurerAdapter {

    private final AuthenticationManager authenticationManager;

    public AuthConfig(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;
    }


    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("clientid")
                .secret(passwordEncoder().encode("secret"))
                .authorizedGrantTypes("authorization_code", "client_credentials", "password")
                .scopes("myscope")
                .redirectUris("http://localhost:8080/oauth/login/client-app");
    }

    /**
     * Precisamos para uso do Password Flow
     */
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager).
                tokenStore(tokenStore())
                .accessTokenConverter(accessTokenConverter());
    }

    @Bean
    PasswordEncoder passwordEncoder() {
        return PasswordEncoderFactories.createDelegatingPasswordEncoder();
    }


    @Bean
    TokenStore tokenStore() {
        return new JwtTokenStore(accessTokenConverter());
    }

    @Bean
    JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter();
        jwtAccessTokenConverter.setSigningKey("ABC");
        return jwtAccessTokenConverter;
    }
}

Что ж, когда я пытаюсь получить токен доступа, мне нужно пропустить «clientid» и «secret» через заголовки, например так (работает очень хорошо, возвращая токен JWT):

curl clientid:secret@localhost:8080/oauth/token -dgrant_type=client_credentials -dscope=myscope

Но если я попробую это:

 curl localhost:8080/oauth/token -dgrant_type=client_credentials -dscope=transferir-valores -dclient_id=clientid -dclient_secret=secret

Я получил неавторизованное сообщение.

1 Ответ

0 голосов
/ 02 июля 2019

Второй запрос неверен, и поэтому вы получаете неавторизованное сообщение.Проверьте следующую выдержку из спецификации :

Клиенты, владеющие паролем клиента, МОГУТ использовать базовую схему аутентификации HTTP, как определено в [RFC2617], для аутентификации на сервере авторизации.Идентификатор клиента кодируется с использованием «application / x-www-form-urlencoded»

В качестве альтернативы, сервер авторизации МОЖЕТ поддерживать включение учетных данных клиента в тело запроса.

Включая клиентаУчетные данные в теле запроса с использованием двух параметров НЕ РЕКОМЕНДУЕТСЯ

Рекомендуется отправлять учетные данные клиента в качестве базовой аутентификации (кодировать учетные данные в base64, добавляя его в заголовки).Примерно так:

curl -X POST \ http://localhost:8443/auth-service/oauth/token \ -H 'Authorization: Basic VEVTVF9TRVJWSUNFOnBhc3N3b3Jk' \ -H 'Content-Type: application/x-www-form-urlencoded' \ -d grant_type=client_credentials

...