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?
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? –
Immagino sia necessario creare un 'Bean' di quel tipo. Aggiornerò il codice nella risposta. –
In realtà potrebbe non essere necessario impostare 'spring.oauth2.client.clientId' (piuttosto che lasciarlo vuoto). Ci faccia sapere se funziona. –