7

Vogliamo configurare un microservizio che fornisce un'API REST in modo che sia configurato come server di risorse OAuth2. Questo servizio dovrebbe anche fungere da client OAuth2 con la concessione di credenziali del client. Ecco la configurazione:Come sovrascrivere l'autoconfigurazione del client Spring Cloud OAuth2?

spring.oauth2.client.id=clientCredentialsResource 
spring.oauth2.client.accessTokenUri=http://localhost:9003/oauth/token 
spring.oauth2.client.userAuthorizationUri=http://localhost:9003/oauth/authorize 
spring.oauth2.client.grantType=client_credentials 
spring.oauth2.client.clientId=<service-id> 
spring.oauth2.client.clientSecret=<service-pw> 

La parte del server delle risorse funziona correttamente. Per la parte client che vogliamo usare Feign, nastro e Eureka:

@FeignClient("user") 
public interface UserClient 
{ 
    @RequestMapping(method = RequestMethod.GET, value = "/user/{uid}") 
    Map<String, String> getUser(@PathVariable("uid") String uid); 
} 

Sulla base del succo in questione https://github.com/spring-cloud/spring-cloud-security/issues/56 ho creato una richiesta intercepter fingere che imposta il token di accesso dal modello OAuth2RestOperations autowired nella richiesta di intestazione fingere

@Autowired 
private OAuth2RestOperations restTemplate; 

template.header(headerName, String.format("%s %s", tokenTypeName, restTemplate.getAccessToken().toString())); 

Ma questo mi dà l'errore a chiamare il servizio all'utente:

error="access_denied", error_description="Unable to obtain a new access token for resource 'clientCredentialsResource'. The provider manager is not configured to support it. 

Come posso vedere l'OAuth2ClientAutoConf iguration crea sempre un'istanza di AuthorizationCodeResourceDetails per un'applicazione Web ma non i ClientCredentialsResourceDetails richiesti, che vengono utilizzati solo per applicazioni non Web. Alla fine il non accesso privider token è responsabile per i dettagli delle risorse e la chiamata non è riuscita a

AccessTokenProviderChain.obtainNewAccessTokenInternal(AccessTokenProviderChain.java:146) 

ho cercato di sovrascrivere la configurazione automatica, ma non è riuscito. Qualcuno può darmi un suggerimento come farlo?

risposta

8

Per disattivare questa parte di autoconfigurazione è possibile impostare spring.oauth2.client.clientId= (vuoto), (secondo il codice sorgente), altrimenti è necessario "escluderlo" nello @EnableAutoConfiguration. Se lo fai, puoi semplicemente impostare il tuo OAuth2RestTemplate e inserire l'ID cliente "reale" dalla tua configurazione, ad es.

@Configuration 
@EnableOAuth2Client 
public class MyConfiguration { 

    @Value("myClientId") 
    String myClientId; 

    @Bean 
    @ConfigurationProperties("spring.oauth2.client") 
    @Primary 
    public ClientCredentialsResourceDetails oauth2RemoteResource() { 
    ClientCredentialsResourceDetails details = new ClientCredentialsResourceDetails(); 
    details.setClientId(myClientId); 
    return details; 
    } 

    @Bean 
    public OAuth2ClientContext oauth2ClientContext() { 
    return new DefaultOAuth2ClientContext(new DefaultAccessTokenRequest()); 
    } 

    @Bean 
    @Primary 
    public OAuth2RestTemplate oauth2RestTemplate(
     OAuth2ClientContext oauth2ClientContext, 
     OAuth2ProtectedResourceDetails details) { 
    OAuth2RestTemplate template = new OAuth2RestTemplate(details, 
     oauth2ClientContext); 
    return template; 
    } 

} 
+0

Grazie per la risposta rapida! Questo è qualcosa che ho provato. L'esclusione della configurazione automatica non funziona perché una dipendenza dal cablaggio automatico non è riuscita. Ho provato ora a impostare il clientId vuoto che ha funzionato, ma per qualche motivo non riesco a collegare automaticamente OAuth2RestOperations restTemplate di più da cui volevo ottenere il token di accesso. Qualche idea? –

+0

Immagino sia necessario creare un 'Bean' di quel tipo. Aggiornerò il codice nella risposta. –

+0

In realtà potrebbe non essere necessario impostare 'spring.oauth2.client.clientId' (piuttosto che lasciarlo vuoto). Ci faccia sapere se funziona. –

Problemi correlati