Несанкционированная ошибка на сервере авторизации Spring Boot /oauth/authorize

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


person int-main    schedule 20.03.2019    source источник


Ответы (2)


/oauth/authorize 

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

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

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

    @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
person wl.GIG    schedule 21.03.2019
comment
Помимо моего ответа, точка после добавления redirect_uri совершенно верна, и я не упомянул об этом явно. Это решение выглядит так, как будто оно захватывает его полностью. Большое спасибо! - person int-main; 21.03.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.

person int-main    schedule 21.03.2019