Я пытаюсь настроить сервер OAuth2, который сможет завершить основные потоки OAuth2 (см. Примеры here).Spring Boot OAuth2 с базовой аутентификацией и пользовательскими UserDetailsService
Извиняюсь за длинный вопрос
Моя первая попытка, чтобы быть в состоянии выполнить authorization_code поток.
У меня есть следующая конфигурация:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig
extends WebSecurityConfigurerAdapter {
....
@Inject
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(userDetailsService)
.passwordEncoder(passwordEncoder());
}
...
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.formLogin().loginPage("/login").permitAll()
.and()
.requestMatchers().antMatchers("/login", "/oauth/authorize", "/oauth/confirm_access")
.and()
.authorizeRequests().anyRequest().authenticated();
}
...
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
конфигурации моего сервера
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorServerConfig
extends AuthorizationServerConfigurerAdapter {
@Inject
private TokenStore tokenStore;
@Inject
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints
.tokenStore(tokenStore)
.authenticationManager(authenticationManager);
}
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
security
.allowFormAuthenticationForClients()
.checkTokenAccess("authenticated()");
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
.inMemory()
.withClient("foo")
.secret("foo")
.authorizedGrantTypes("authorization_code","password", "refresh_token")
.scopes(new String[] { "read", "write" })
}
И действительно мой код авторизации потока работает нормально! Проблема начинается, когда я пытаюсь сделать поток пароль следующим образом:
POST localhost:8200/oauth/token
Content-Type: application/x-www-form-urlencoded
Accept:application/json
Authorization:Basic Zm9vOmZvbw=="
username=admin&password=admin&grant_type=password&scope=read%20write&client_secret=foo&client_id=foo&
Моя проблема заключается в том, что заголовок Authorization игнорируется, является ли он или нет, результат тот же, это дает мне обратно access_token и refresh_token
Если я пытаюсь включить базовую аутентификацию следующим образом, позволяет ClientUserDetailsService, чтение клиентов из базы данных JDBC:
public class SecurityConfig
extends WebSecurityConfigurerAdapter {
....
@Bean
public ClientDetailsUserDetailsService clientDetailsUserDetailsService(ClientDetailsService clientDetailsService){
// JDBC clientDetailsService
return new ClientDetailsUserDetailsService(clientDetailsService);
}
@Inject
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(clientDetailsUserDetailsService());
}
...
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
DaoAuthenticationProvider p = new DaoAuthenticationProvider();
p.setUserDetailsService(userDetailsService);
p.setPasswordEncoder(passwordEncoder());
return new ProviderManager(Lists.newArrayList(p));
// return super.authenticationManagerBean();
}
}
Теперь то, что я достиг должны иметь базовую аутентификацию работает нормально, НО я потерять authorization_ поток кода, поскольку базовая аутентификация теперь выполняется против клиента и секретности, а НЕ фактические учетные данные пользователя
Я что-то упустил? Как я могу использовать оба потока? Пожалуйста, помогите, я боюсь уже несколько дней.
Некоторые подобные вопросы, но без удачи:
- problems injecting custom userDetailsService in Spring Security OAuth2
- Spring Boot OAuth 2.0 UserDetails user not found