Почему spring-security-oauth2 выдает несанкционированную ошибку в конечной точке токена? Как открыть доступ к конечной точке? - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь создать пример сервера авторизации, используя инфраструктуру Spring Security oauth2. Учебники сбивают с толку по сравнению с любыми другими примерами, связанными с пружиной.

Обновление: Если вы ищете рабочее решение, перейдите к моему ответу. Игнорируйте код ниже.

Когда я вызывал конечную точку выпуска токена, была выдана следующая ошибка

{
    "error": "unauthorized",
    "error_description": "Full authentication is required to access this resource"
}

Вот мои настройки (с помощью Groovy). Я использую spring-security-oauth2: 2.3.4.RELEASE, spring-cloud-security: 2.0.1.RELEASE и загрузку: 2.1.1.RELEASE.

@Configuration
@CompileStatic
class OAuth2ClientSpringConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    AuthenticationManager authenticationManager

    @Autowired
    UserDetailsService userDetailsService

    // register clients
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory().withClient('clientone')
                .secret('secret')
                .authorizedGrantTypes('password')
                .scopes('one', 'two')
    }

    //use default auth manager and user details service
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager)
                .userDetailsService(userDetailsService)
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.allowFormAuthenticationForClients()
        security.tokenKeyAccess("permitAll()")
                .checkTokenAccess("isAuthenticated()")
                .allowFormAuthenticationForClients()  //<--- update
    }
}

Статические учетные данные пользователя

@Configuration
@CompileStatic
class UserCredentialsSpringConfig extends WebSecurityConfigurerAdapter {

    @Bean
    AuthenticationManager authenticationManagerBean() {
        super.authenticationManagerBean()
    }

    @Bean
    UserDetailsService userDetailsServiceBean() {
        super.userDetailsServiceBean()
    }

    protected void configure(AuthenticationManagerBuilder auth) {
        auth.inMemoryAuthentication()
                .withUser('user1').password('pwd1').roles('USER')
                .and()
                .withUser('admin').password('pwd1').roles('ADMIN')
    }

    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/oauth/token").permitAll()
                .anyRequest().authenticated()
    }
}

Настройка почтальона

  • Добавлены учетные данные клиента в обоих местах - заголовок авторизации и обычный заголовок.

enter image description here


enter image description here

  • Использовал параметры формы тела для отправки учетных данных пользователя

enter image description here


Натолкнулся на следующую ошибку , когда я нажму http://localhost:8080/auth/oauth/token

enter image description here

Я изучал различные уроки и не понял этого. Любые входные данные будут полезны.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

В Интернете есть несколько учебных пособий, но некоторые из них не упоминают, что используют Boot 1.x. Это то, с чем я столкнулся, когда объединил эти инструкции с Boot 2.x. Эти учебные пособия могут быть действительными с Boot 2.x, но все уже достаточно сбивало с толку, так что я не мог найти работающую модель.

Вот рабочее решение для Boot 2.x. Я начал заново с примера кода на https://github.com/spring-projects/spring-security-oauth2-boot/tree/master/samples/spring-boot-sample-secure-oauth2-provider.

Импорт зависимости spring-security-oauth2-autoconfigure. Добавьте @EnableAuthorizationServer в ваш основной класс. Это все, что вам нужно для простейшей рабочей модели. Нет необходимости добавлять AuthorizationServerConfigurerAdapter и т. Д., Поскольку он автоматически настраивается с использованием данных из application.yml. Посмотрите на application.yml в приведенной выше ссылке на github.

Вот конфигурация Почтальона

Скопируйте пример идентификатора клиента и секрет из application.yml и предоставьте их в качестве заголовков Auth.

enter image description here

Скопируйте сгенерированный пароль из журнала загрузки и поместите его в данные формы тела вместе с другими атрибутами, как показано на рисунке.

enter image description here

Вот и все. Нажмите http://localhost:8080/oauth/token, и вы должны увидеть что-то вроде ниже

enter image description here

0 голосов
/ 10 января 2019

По спецификации the token issue endpoint должен быть защищен.

Вы должны предоставить client_id и client_secret в качестве параметров (форма) или в качестве основного http-заголовка авторизации

Взят прямо из спецификации

 POST /token HTTP/1.1
 Host: server.example.com
 Content-Type: application/x-www-form-urlencoded

 grant_type=refresh_token&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA
 &client_id=s6BhdRkqt3&client_secret=7Fjfp0ZBr1KtDRbnfVdmIw

Пожалуйста, оставьте отзыв

https://tools.ietf.org/html/rfc6749#section-2.3.1

Почему бы нам на некоторое время не исключить клиента из вашего уравнения, а просто сосредоточиться на вашей конечной точке токена

curl - ваш друг, вот пример FORM (проверенный рабочий пример для локального UAA Cloud Foundry, где секретом клиента является пустая строка)

curl -v \
    -H "Content-Type=application/x-www-form-urlencoded" \
    -H "Accept=application/json" \
    -d "grant_type=password" \
    -d "client_id=cf" \
    -d "response_type=token" \
    -d "username=marissa" \
    -d "password=koala" \
    -d "client_secret=" \
    http://localhost:8080/uaa/oauth/token

и используя http-basic

curl -v \
    -H "Content-Type=application/x-www-form-urlencoded" \
    -H "Accept=application/json" \
    -d "grant_type=password" \
    -d "client_id=cf" \
    -d "response_type=token" \
    -d "username=marissa" \
    -d "password=koala" \
    -u "cf:" \
    http://localhost:8080/uaa/oauth/token

Можете ли вы выполнить эти команды с вашими фактическими данными и сообщить нам команды (возможно, обновить ваш вопрос) и сообщить нам результаты. Видите ли, мы не знаем, что на самом деле делает ваше приложение пользовательского интерфейса, и использование curl позволит нам исключить это из вопроса.

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