Несанкционированная ошибка на сервере авторизации Spring Boot / oauth / authorize - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь разработать простой POC для сервера авторизации OAuth2 в Spring Boot с использованием @EnableAuthorizationServer и клиента в памяти.

Мой класс конфигурации Web Security выглядит следующим образом:

package com.example.authservice;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/**")
                .authorizeRequests().
                antMatchers("/", "/login**", "/oauth/authorize", "/oauth/authorize**")
                .permitAll().
                anyRequest()
                .authenticated();
    }
}

И конфигурация сервера авторизации выглядит следующим образом:

package com.example.authservice;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory().
                withClient("auth-client").
                secret("secret-key").
                authorizedGrantTypes("authorization_code").
                scopes("openid");
    }

}

Это основано на потоке предоставления кода авторизации и когда я пытаюсь получить код (который будет использоваться при следующем вызове для получения токена доступа),Я получаю несанкционированную ошибку.

curl -X GET \
  'http://localhost:8080/oauth/authorize?client_id=auth-client&client_secret=secret-key&grant_type=authorization_code&response_type=code'

Ошибка:

{
    "timestamp": "2019-03-20T15:35:41.009+0000",
    "status": 403,
    "error": "Forbidden",
    "message": "Access Denied",
    "path": "/oauth/authorize"
}

Я предположил, что, поскольку /oauth/authorize разрешен в моей конфигурации веб-безопасности, он должен вернуть код, который можно использоватьполучить токен доступа.Кто-нибудь знает, что может быть не так.

Ответы [ 2 ]

1 голос
/ 21 марта 2019
/oauth/authorize 

является конечной точкой сервера авторизации по умолчанию, что означает, что она имеет высокий уровень безопасности.

authorizeRequests().antMatchers("/oauth/authorize").permitAll()

не будет работать на API безопасности Spring по умолчанию.Будет лучше, если вы используете браузер для тестирования с такими вещами, как

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .inMemoryAuthentication().passwordEncoder(new PasswordEncoder() {
        @Override
        public String encode(CharSequence charSequence) {
            return charSequence.toString();
        }

        @Override
        public boolean matches(CharSequence charSequence, String s) {
            return s.equals(charSequence.toString());
        }
    })
        .withUser("gig")
        .password("123456")
        .roles("USER");

}

, также лучше добавить redirectUris после вашей области видимости.URL моего теста

http://localhost:8080/oauth/authorize?response_type=code&client_id=auth-client-&redirect_uri=http://www.baidu.com&scope=all
0 голосов
/ 21 марта 2019

Когда пользователь пытается сгенерировать код авторизации, позвонив по номеру /oauth/authorize, он должен сообщить службе, кем он является, то есть аутентифицироваться.Вот как конечная точка авторизации узнает, авторизован ли пользователь для получения этого токена.Итак, важной частью, которая отсутствовала в моем сервисе, является Аутентификация.В Spring Boot аутентификация обрабатывается AuthenticationManager.

. Чтобы добавить недостающий фрагмент, ниже приведена модифицированная версия WebSecurityConfigurerAdapter.java:

package com.example.authservice;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf()
                .disable()
                .antMatcher("/**")
                .authorizeRequests()
                .antMatchers("/login")
                .permitAll()
                .anyRequest()
                .authenticated()
                .and().
                httpBasic();
    }

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("user").password("{noop}password").roles("ROLE");
    }
}

. Это добавляет базовую аутентификацию HTTPна сервис Spring Boot.Теперь, когда вы попытаетесь вызвать /oauth/authorize с базовой аутентификацией HTTP, он будет успешно перенаправлен на ваш переданный redirect_uri.

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