OIDC Flow per SPA e RESTful API

10

Sto creando una app a pagina singola (SPA) e una API RESTful . L'API ha bisogno di sicurezza: alcuni utenti possono effettuare chiamate solo su determinati endpoint. Ho un provider di identità esterno (IdP (Okta)) che voglio che l'utente si autentichi utilizzando il protocollo OpenId Connect . Sto cercando di chiarire i passaggi corretti per l'autenticazione e l'autorizzazione della SPA all'API RESTful. I due flussi che ho visto sono il flusso del codice di autorizzazione e il flusso implicito.

Se dovessi andare con Flusso implicito , i passaggi sarebbero:

  1. L'utente visita la SPA, che reindirizza l'utente all'IdP per l'accesso.
  2. Una volta effettuato l'accesso, l'IdP restituisce l'utente alla SPA con un token di accesso e un token ID.
  3. (Questo è il passo di cui non sono sicuro) Ogni volta che la SPA effettua una richiesta all'API RESTful, passa il token di accesso e il token ID insieme alla richiesta, che l'API RESTful convalida e quindi verifica che l'utente abbia autorità per accedere al particolare endpoint. Se lo fa, restituisce il risultato, altrimenti l'utente non è autorizzato.

Se dovessi utilizzare il flusso del codice di autorizzazione , i passaggi sarebbero:

  1. Come sopra il passaggio 1.
  2. Una volta effettuato l'accesso, l'IdP restituisce l'utente alla SPA con un codice di autorizzazione.
  3. (Anche in questo caso, il passaggio che non sono sicuro è corretto) Ogni volta che la SPA effettua una richiesta all'API RESTful, passa il codice di autorizzazione insieme alla richiesta, che quindi l'API RESTful scambia (insieme a un segreto del client) con l'IdP per un token di accesso e un token ID. Li utilizza per verificare se l'utente può accedere a quel particolare endpoint. Se lo fa, restituisce il risultato, altrimenti non sono autorizzati.

Penso che il flusso implicito sia quello da utilizzare in questo scenario, ma ho i passaggi corretti? In particolare, il passaggio 3, l'invio di due token in ogni richiesta, non sembra corretto. Ma penso di aver bisogno di entrambi i token per convalidare e determinare l'utente. Aiuto apprezzato!

    
posta Steve 13.07.2016 - 06:54
fonte

1 risposta

10

Ecco la differenza tra Flusso implicito e Flusso AuthCode:

Flusso implicito

  1. L'utente passa a SPA, che reindirizza l'utente a IdP per accedere.
  2. L'utente accede (e autorizza l'applicazione, se necessario).
  3. IdP restituisce l'utente a SPA con token di accesso e token ID.
  4. Il codice JavaScript in SPA memorizza il token di accesso e il token ID nella localStorage del browser e invia il token di accesso al server API REST per ogni richiesta effettuata (solitamente come intestazione Authorization: Bearer <access token> ).
  5. Se necessario, REST API Server verifica la validità del token di accesso parlando con l'IdP. (Spesso, firmare il token nell'IdP e verificare che la firma sia sufficiente e nessuna comunicazione è effettivamente necessaria.)

Flusso del codice di autorizzazione

  1. L'utente passa a SPA, che reindirizza l'utente a IdP per accedere.
  2. L'utente accede (e autorizza l'applicazione, se necessario).
  3. IdP restituisce l'utente a SPA con codice di autorizzazione.
  4. Il codice JavaScript in SPA invia il codice di autorizzazione a un login endpoint sul server API REST.
  5. Il server API REST invia una richiesta al server IdP contenente il codice di autorizzazione (e di solito anche un ID client e un segreto client che identificano il server API REST sul server IdP).
  6. IdP convalida il codice di autorizzazione e invia il token di accesso e il token ID al server API REST.
  7. Il server API REST archivia il token di accesso e il token ID nella sua memoria e invia il proprio token di sessione alla SPA.
  8. Per ogni richiesta che la SPA esegue al server API REST, include il token di sessione che il server API REST ha fornito. Se il server API REST deve richiedere risorse da un altro server, utilizza il token di accesso memorizzato per effettuare tale richiesta.

Da qui puoi vedere che il flusso AuthCode è significativamente più complicato del Flusso implicito, ma con il vantaggio che il token di accesso non viene mai memorizzato nel controllo dell'utente.

Tuttavia, il punto principale di memorizzazione del token in questo caso non è per la propria autenticazione, ma nel caso in cui il server REST API abbia bisogno di parlare con altri servizi, come Google, Facebook, Twitter, ecc.

Se utilizzi OpenID Connect solo per accedere al tuo server API REST, ma le credenziali non devono mai essere utilizzate dal server stesso, implementare Implicit Flow è molto più semplice e implementare il flusso AuthCode non in realtà ti guadagna qualcosa.

    
risposta data 19.07.2016 - 22:21
fonte

Leggi altre domande sui tag