Spring Boot 2 и OAuth2 client-credentials неподдерживаемый тип предоставления

Я хотел бы защитить свое приложение с помощью сервера ресурсов и сервера авторизации 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 Security OAuth2 2.0.14.RELEASE. Как и в моем случае, используется InMemoryTokenStore, он будет работать с одним экземпляром, что является лучшей заменой для этого, если нужно создать несколько экземпляров приложения?

В вашем проекте есть корсфильтр?

Jay 30.05.2018 14:10

Нет, в моем проекте нет Corsfilter

Macieyo 30.05.2018 14:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
2 008
1

Ответы 1

Когда вы сохраняете пользователей в памяти, вы предоставляете пароли в виде обычного текста, а затем, когда вы пытаетесь получить кодировщик из 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, сделав то же самое для пароля.

Другие вопросы по теме