2013-01-03 1 views
15

Sto cercando di capire e implementare un flusso di credenziali client tra il nostro nuovo server REST e la nostra app client esistente. Ho installato OAuth2 di sicurezza primaverile come this. Dalla mia comprensione finora, il mio server dovrebbe supportare la seguente richiesta:Informazioni sul flusso di credenziali del client OAuth2

$ curl -X -v -d 'client_id=the_client&client_secret=secret&grant_type=client_credentials' -X POST "http://localhost:9090/oauth/token" 

ma ottengo

InsufficientAuthenticationException: There is no client authentication 

causati dalla Principal essendo null qui (codice a molla di sicurezza):

@FrameworkEndpoint 
@RequestMapping(value = "/oauth/token") 
public class TokenEndpoint extends AbstractEndpoint { 

    @RequestMapping 
    public ResponseEntity<OAuth2AccessToken> getAccessToken(Principal principal, 
      @RequestParam("grant_type") String grantType, @RequestParam Map<String, String> parameters) { 

     if (!(principal instanceof Authentication)) { 
      throw new InsufficientAuthenticationException(

Quindi a quanto pare, ho bisogno di autenticare contro il server prima. Ma questo è non quello che voglio fare. Voglio che due dei miei server parlino tra loro usando un segreto condiviso. Il server del provider OAuth deve fornire un token di accesso al server client (attendibile) su richiesta in modo che il server client possa quindi utilizzare quel token per accedere a tutte le risorse REST sul server. Questo dovrebbe proteggere le risorse REST dall'accesso esterno.

In seguito desidero fornire risorse selezionate a una terza parte e infine implementare una sicurezza a grana più fine anche per la comunicazione da server a server. Ma per ora ho bisogno di proteggere il server REST dall'accesso esterno.

Sembra che potrei avere delle incomprensioni sull'intero flusso di credenziali dei clienti o sull'applicazione della sicurezza di primavera proprio lì, quindi qualsiasi chiarimento sarebbe molto apprezzato.

risposta

18

Non si sta autenticando il client sul server di autorizzazione.

Hai bisogno di fare qualcosa di simile:

curl --user the_client:secret --data "grant_type=client_credentials" http://localhost:9090/oauth/token 

Questo è l'autenticazione del client al server di autorizzazione e quindi specificando grant_type ed altri parametri. Ciò restituirà un token di accesso di tipo "bearer" con scope determinato dai dettagli del client oauth. Una volta ottenuto il token, è possibile accedere alle risorse protette impostando l'intestazione Autorizzazione:

curl -H "Authorization: Bearer <accessToken>" <resourceUrl> 
+0

Grazie per la risposta. Quindi il mio pensiero è sostanzialmente corretto? Per il flusso delle credenziali del client richiedo un token con le credenziali del client e il tipo di concessione e quindi utilizzo quel token per accedere alle risorse protette? Penso di avere un errore di installazione, perché usando il progetto di esempio sparklr la chiamata che ho menzionato sopra funziona ... – Pete

+0

Penso che tu sia sulla strada giusta. Il client richiede un token prima utilizzando un particolare tipo di concessione. Quindi basta passare il token nell'intestazione auth quando si accede alla risorsa protetta. Ho aggiornato la mia risposta con un esempio di accesso alla risorsa. – kldavis4