Execute um aplicativo oAuth2 do Spring Boot como servidor de recursos E servindo conteúdo da Web

Estou usando o Spring Boot 1.5.13 e com esse Spring Security 4.2.6 e Spring Security oAuth2 2.0.15.

Desejo encontrar uma configuração de práticas recomendadas para nossos aplicativos Spring Boot que atendem a um conjunto misto de conteúdo: uma API REST e algumas páginas da web que fornecem uma "página de entrada" conveniente para desenvolvedores com alguns links, além de documentação da API baseada no Swagger , que também é conteúdo da web.

Eu tenho uma configuração que me permite executar o aplicativo com o fluxo de código de autorização adequado, portanto, eu posso acessar todo o conteúdo da web pelo navegador e me autenticar pelo IdP configurado (no meu caso, PingFederate), além de fazer chamadas de API no navegador , ou seja, diretamente ou com um cliente REST, por exemplo com RESTClient.

Esta é minha configuração de segurança:

@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();
    }

}

e a configuração 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;
    }

}

Mas quando eu quero chamar uma API REST programaticamente / fora do navegador com um token de portador no cabeçalho, por exemplo, com curl, o fluxo do código de autorização entra em ação e redireciona para o terminal de logon local. O que eu quero é que as chamadas de API aceitem o token do portador para autenticação, sem criar uma sessão, e que todo o conteúdo da Web / chamadas de mvc no navegador estabeleçam uma sessão.

curl -i -H "Accept: application/json" -H "Authorization: Bearer $TOKEN" -X GET http://localhost:8080/authdemo/api/hello

Adicionando a anotação @EnableResourceServer à classe SecurityConfig acima (e adicionando security.oauth2.resource.filter-order = 3 no arquivo de propriedades do aplicativo, posso fazer o comando curl funcionar, mas o fluxo do código de autorização está quebrado, recebo o seguinte resultado no navegador para todos os URLs no meu aplicativo:

<oauth> <error_description> Full authentication is required to access this resource </error_description> <error>unauthorized</error> </oauth>

Agora existe uma maneira de fazer esse szenario funcionar bem? Se sim, como seria isso? Ou ele é suportado apenas em versões posteriores do Spring Boot + Security + oAuth2?

A pergunta emInicialização de primavera com segurança OAuth2 - como usar o servidor de recursos com o formulário de login na web? é bem parecido

questionAnswers(1)

yourAnswerToTheQuestion