9

voglio sviluppare due servizi indipendenti, uno per la roba di business e una per l'autenticazione degli utenti utilizzando Primavera OAuth 2Primavera OAuth: Server Resource con autorizzazione del server backend

Chiamiamoli business-Service e OAuth-Service.

Ora desidero il delegato Business-Service per il servizio OAuth se una richiesta non è autenticata. L'applicazione client (un'app per Android) non dovrebbe conoscere a priori il servizio OAuth, dovrebbe essere delegata ad esso dal Business Service con un reindirizzamento HTTP 302 per richiesta non autenticata. Per essere precisi, desidero che la mia pagina di destinazione dell'API fornisca un collegamento a http://businessservice.com/login e quando l'app del mio cliente decide di seguire questo link, viene reindirizzato al servizio OAuth.

Se annoto Business-Service con @EnableOAuth2Resource, tutte le sue risorse sono protette restituendo un 401 quando le arringo senza un token di accesso. Fin qui tutto bene. Se fornisco un token di accesso come questo:

curl -v http://localhost:8667/resource/ -H "Authorization: Bearer $TOKEN" 

Posso accedere alla risorsa. Ancora buono.

Tuttavia, se annoto Business-Service con @EnableOAuth2Sso per abilitare il reindirizzamento al servizio OAuth, perde la possibilità di accedere alle risorse con un token di accesso (stesso curl come sopra), restituisce solo un 302 al login pagina http://localhost:8667/login

Se io uso entrambe le annotazioni, l'@ EnableOAuth2Resource sembra sempre di "vincere", come le opere di autenticazione, ma chiamando http://localhost:8667/login restituisce un 404.

Allora, qual è il modo giusto per creare un server di risorse che i delegati al server di autenticazione per le chiamate non autenticate?

risposta

4

Dopo aver provato per ore ho trovato una soluzione.

Il Business Server (Server Resource) ora appare come segue:

@SpringBootApplication 
@EnableOAuth2Sso 
@EnableOAuth2Resource 
public class BusinessService { 

    public static void main(final String[] args) { 
     final ConfigurableApplicationContext context = SpringApplication.run(BusinessService.class, args); 
    } 

} 

con due configurazioni, una per lo SSO:

@Configuration 
public class OAuth2SsoConfiguration extends OAuth2SsoConfigurerAdapter { 

    @Override 
    public void match(final RequestMatchers matchers) { 
     matchers.antMatchers("/"); 
    } 

    @Override 
    public void configure(final HttpSecurity http) throws Exception { 
     http.authorizeRequests().anyRequest().permitAll(); 
    } 

} 

e uno per la risorsa:

@Configuration 
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { 

    @Override 
    public void configure(final HttpSecurity http) throws Exception { 
     http.requestMatchers().antMatchers("/resource/**").and().authorizeRequests().anyRequest().authenticated().antMatchers("/").permitAll(); 

    } 

} 



Il risultato è il seguente:

curl -v http://localhost:8667/ 

restituisce

HTTP/1.1 200 OK 
{"links":[{"rel":"login","href":"http://localhost:8667/login"}]} 



curl -v http://localhost:8667/resource/ 

rendimenti

HTTP/1.1 401 Unauthorized 
{"error":"unauthorized","error_description":"Full authentication is required to access this resource"} 



curl -v http://localhost:8667/login 

rendimenti

HTTP/1.1 302 Found 
Location: http://localhost:8666/user/oauth/authorize?client_id=clientId&redirect_uri=http%3A%2F%2Flocalhost%3A8667%2Flogin&response_type=code&state=YmmNO9 

Quindi il mio servie business è fissato con un server di risorsa restituisce un 401 per tutte le risorse aziendali. La radice del servizio è applicabile a tutti i client in modo che possano scoprire la relazione di accesso e se seguono questa relazione, vengono reindirizzati al server di autorizzazione

+1

potresti condividere come ottieni le informazioni utente nel server di risorse dopo l'utente è autenticato da oauth2? – Kane

+0

@Kane, è troppo tardi, ma può aiutare gli altri. È possibile utilizzare i seguenti parametri negli endpoint: @RequestHeader (value = "Autorizzazione") String authorizationHeader, Principal currentUser – Sourabh

Problemi correlati