? У вас нет отдельной конфигурации для клиентской части Oauth2?
ользую Spring Boot 1.5.13, а также Spring Security 4.2.6 и Spring Security oAuth2 2.0.15.
Я хочу найти наилучшую настройку для наших приложений Spring Boot, которые обслуживают смешанный набор контента: API REST и некоторые веб-страницы, которые предоставляют удобную «целевую страницу» для разработчиков с некоторыми ссылками на них, а также документацию API на основе Swagger. , который также является веб-контентом.
У меня есть конфигурация, которая позволяет мне запускать приложение с правильным потоком кода авторизации, поэтому я могу получить доступ ко всему веб-контенту через браузер и пройти аутентификацию с помощью настроенного IdP (в моем случае PingFederate), плюс я могу выполнять вызовы API из браузера. то есть напрямую или с клиентом REST, например с RESTClient.
Это моя конфигурация безопасности:
@Slf4j
@Configuration
@EnableWebSecurity
@EnableOAuth2Sso // this annotation must stay here!
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/login**", "/webjars/**", "/css/**").permitAll()
.antMatchers("/cfhealth").permitAll()
.antMatchers("/").permitAll()
.antMatchers("/protected", "/api/**").authenticated();
}
@Bean
public RequestContextListener requestContextListener() {
return new RequestContextListener();
}
}
и конфигурация oAuth2:
@Configuration
@Slf4j
public class OAuth2Config extends ResourceServerConfigurerAdapter {
@Value("${pingfederate.pk-uri}")
String pingFederatePublicKeyUri;
@Autowired
PingFederateKeyUtils pingFederateKeyUtils;
@Override
public void configure(ResourceServerSecurityConfigurer config) {
config.tokenServices(tokenServices());
}
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(accessTokenConverter());
}
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
String certificate = pingFederateKeyUtils.getKeyFromServer(pingFederatePublicKeyUri);
String publicKey = pingFederateKeyUtils.extractPublicKey(certificate);
converter.setVerifier(pingFederateKeyUtils.createSignatureVerifier(publicKey));
return converter;
}
@Bean
@Primary
public DefaultTokenServices tokenServices() {
DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
defaultTokenServices.setTokenStore(tokenStore());
return defaultTokenServices;
}
}
Но когда я хочу вызвать REST API программно / вне браузера с токеном-носителем в заголовке, например, при использовании curl поток кода авторизации запускается и перенаправляет на локальную конечную точку входа в систему. Я хочу, чтобы вызовы API принимали маркер носителя для аутентификации без создания сеанса и чтобы все вызовы веб-содержимого / mvc в браузере устанавливали сеанс.
curl -i -H "Accept: application/json" -H "Authorization: Bearer $TOKEN" -X GET http://localhost:8080/authdemo/api/hello
Добавив аннотацию @EnableResourceServer к указанному выше классу SecurityConfig (и добавив security.oauth2.resource.filter-order = 3 в файл свойств приложения, я могу заставить команду curl работать, но тогда поток кода авторизации нарушается, я получаю следующий вывод в браузере для всех URL в моем приложении:
<oauth> <error_description> Full authentication is required to access this resource </error_description> <error>unauthorized</error> </oauth>
Есть ли способ заставить этот сценарий работать хорошо? Если да, как это будет выглядеть? Или это поддерживается только в более поздних версиях Spring Boot + Security + oAuth2?
Вопрос наSpring Boot with Security OAuth2 - как использовать сервер ресурсов с веб-формой входа? очень похоже