Клиентские учетные данные Spring Boot 2 и OAuth2 не поддерживают тип предоставления - PullRequest
0 голосов
/ 30 мая 2018

Я бы хотел защитить свое приложение, используя Ресурсный сервер и Сервер авторизации Spring Security, включенные в мой компонент.Требуемый поток включает использование только типа предоставления клиентских учетных данных и передачу client_id вместе с client_secret в качестве заголовка base64, что должно возвращать токен для дальнейших запросов после достижения конечной точки oauth/token.Я также включаю grant_type: client-credentials в POST параметры запроса

. Сейчас я получаю сообщение об ошибке: "Full authentication is required to access this resource".Странно то, что, несмотря на мою конфигурацию, Spring по-прежнему генерирует случайный пароль безопасности, который можно увидеть в журнале консоли.

Это мой первый подход к Spring Security, поэтому, может быть, я что-то пропустил?

Нижемоя конфигурация:

AuthorizationServerConfig :

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends 
AuthorizationServerConfigurerAdapter {

@Override
public void configure(final AuthorizationServerSecurityConfigurer security) {
    security
            .tokenKeyAccess("permitAll()")
            .checkTokenAccess("isAuthenticated()");
}

@Override
public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {
    clients
            .inMemory()
            .withClient("some-client")
            .authorizedGrantTypes("client-credentials")
            .authorities("ROLE_CLIENT")
            .scopes("read", "write", "trust")
            .accessTokenValiditySeconds(3600)
            .secret("somePass")
            .refreshTokenValiditySeconds(24*3600);
}

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
    endpoints
            .tokenStore(tokenStore())
            .allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST);
}

@Bean
public TokenStore tokenStore() {
    return new InMemoryTokenStore();
}     
}

ResourceServerConfig:

@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

@Override
public void configure(final HttpSecurity http) throws Exception {
    http
            .authorizeRequests()
            .antMatchers("/oauth/token", "/oauth/authorize", "/oauth/confirm_access").permitAll()
            .antMatchers("/**").authenticated()
            .and().httpBasic().disable()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and().exceptionHandling().accessDeniedHandler(new OAuth2AccessDeniedHandler());
}
}

Я использую Spring Boot 2.0.1.RELEASE и SpringБезопасность OAuth2 2.0.14. ВЫПУСК.Как и в моем случае, InMemoryTokenStore используется, он будет работать с одним экземпляром, что лучше всего подойдет для этого, если вы хотите создать несколько экземпляров приложения?

1 Ответ

0 голосов
/ 30 мая 2018

Когда вы храните пользователей в памяти, вы предоставляете пароли в виде простого текста, а затем, когда вы пытаетесь извлечь кодировщик из DelegatingPasswordEncoder для проверки пароля, он не может его найти.

Вы можете попробовать следующие изменения, чтобы переопределить кодировку пароля, добавив {noop}

@Override
public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {
    clients
            .inMemory()
            .withClient("some-client")
            .authorizedGrantTypes("client-credentials")
            .authorities("ROLE_CLIENT")
            .scopes("read", "write", "trust")
            .accessTokenValiditySeconds(3600)
            .secret("{noop}somePass") //change here
            .refreshTokenValiditySeconds(24*3600);
}

, а также сменить пользователя в WebSecurityConfigurer, выполнив то же самое для пароля.

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