2013-07-14 12 views
13

Desidero proteggere il mio backend Spring RESTful. Un modo (? Destra) è quello di utilizzare OAuth 2.0 come illustrato di seguito:convalidare il token di accesso OAuth 2.0 da un server di risorse Spring RESTful

http://www.youtube.com/watch?v=8uBcpsIEz2I

All'interno mia architettura server di risorse e server di autorizzazione non sono la stessa entità. Fornisco solo alcuni servizi JSON REST. Nessuna interfaccia utente. Se leggo la OAuth2 RFC dicono semplicemente:

L'interazione tra il server e il server di autorizzazione delle risorse è oltre la portata di questa specifica. Il server di autorizzazione potrebbe essere lo stesso server del server di risorse o un'entità separata. Un singolo server di autorizzazione può rilasciare token di accesso accettati da più server di risorse .

Ho trovato un buon diagramma a cloudfoundry.com (legate a quanto sopra video di youtube), che sto usando per illustrare mio punto di vista:

enter image description here

fornitore di "token": Questo potrebbe/dovrebbe essere google o facebook per esempio.

backend RESTful: questo è in realtà il mio codice. Primavera servizi RESTful come:

@Controller 
@RequestMapping("/api/v1") 
public class MyResourceToProtect { 

    @Autowired 
    private MyService service; 

    @RequestMapping(value = "/resource/delete/{name}", 
        method = RequestMethod.DELETE, 
        consumes = MediaType.APPLICATION_JSON_VALUE, 
        headers = "Content-Type=application/json") 
    @ResponseStatus(HttpStatus.OK) 
    public void delete(@PathVariable("name") String name) { 
     service.delete(name); 
    } 
} 

(Questo è solo un po 'di codice di esempio)

Ora la mia domanda: è in qualche modo possibile per convalidare i token di accesso che vengono generati dal authserver (Facebook, Google)? So che ho bisogno di avere una mappatura "token to user" (database) da qualche parte sul mio ResourceServer. Fondamentalmente mi piacerebbe progettare il mio RESTful API come ad uno da PayPal:

https://developer.paypal.com/webapps/developer/docs/integration/direct/make-your-first-call/

Ma come posso gestire le fasi 1 & 2 se voglio usare Facebook o Google come provider di Auth? È possibile?

Riflessione aggiuntiva: Probabilmente ho bisogno di fornire il mio endpoint /oauth2/token e quindi delegare al AuthProvider sottostante.

risposta

4

Non sai come rispondere a tutte le domande con un bel fiocco, quindi mi limiterò a mettere i seguenti punti là fuori:

  • Stai cercando di consumare solo un'API OAuth-sicuro come Facebook in un Moda assicurata da OAuth? Usa Spring Social.
  • Se si sta tentando di creare l'API OWN REST e si utilizza il proprio contesto utente, utilizzare Spring Security OAuth. In questo caso, dovrai richiedere ai clienti di autenticarsi usando OAuth contro la TUA API, non Facebook o LinkedIn, ecc.
  • Spring Social Security (nella serie 1.2.x) supporta 'firmare' l'utente come risultato di un OAuth connessione (ad esempio, "accesso con facebook", "..twitter", "..linkedin", ecc., e alla fine l'applicazione termina con un principal di Spring Security in sessione, proprio come se avessi usato un modulo HTTP per firmare l'utente manualmente.
  • Spring Security OAuth non si cura di dove hai ottenuto il principio di sicurezza Spring. Ci vuole solo se il principale ha i giusti ruoli/ambiti richiesti dal client OAuth di Spring Security. Pertanto, non è possibile utilizzare Spring Social per connettersi in sicurezza a Facebook, utilizzare Spring Social Security per fare in modo che tale connessione crei un oggetto di autenticazione Spring Security, quindi utilizzare Spring Security OAuth per proteggere qualsiasi accesso all'API dell'utente, che in girare potrebbe connettersi in modo sicuro alle API di Facebook dietro le quinte. I client userebbero il token di accesso OAuth per la TUA API, non per Facebook. Questo viene gestito nel servizio.
+0

il mio caso d'uso è molto simile all'OP, e sospetto che la tua risposta per @domi risponda anche al mio problema corrente - Se ho scritto un'applicazione "front-end" usando Spring Social, e ho ottenuto un Token di accesso OAuth, per esempio Google, come dovrebbe quell'applicazione "front-end" passare quel token di accesso alla mia applicazione Spring Security? Abbiamo provato a passarlo attraverso l'intestazione "Authentication:", inutilmente. –

Problemi correlati