Sul Web sono disponibili molte informazioni sull'utilizzo di JWT ( Json Web Token
) per l'autenticazione. Ma non ho ancora trovato una spiegazione chiara di quale dovrebbe essere il flusso quando si utilizzano i token JWT per una soluzione single sign-on in un ambiente con più domini .
Lavoro per un'azienda che ha molti siti su host diversi. Usiamo example1.com e example2.com . Abbiamo bisogno di una soluzione Single Sign-On, il che significa che se un utente si autentica su example1.com , vogliamo che venga autenticato anche su example2.com , automaticamente.
Utilizzando il flusso OpenId Connect , sono consapevole che l'utente che desidera autenticarsi su example1.com verrà prima reindirizzato al server di autenticazione (o OP
: "OpenId Provider"). L'utente si autentica su quel server che quindi lo reindirizza al sito originale example1.com con un token JWT firmato. (Capisco che ci sia un altro flusso che restituisce un token intermedio che a sua volta può essere scambiato per il vero token JWT in seguito, ma non penso che questo sia richiesto per noi) ...
Quindi ora l'utente è tornato su example1.com ed è autenticato! Può effettuare richieste, passando il token JWT in un Authentication
header e il server è in grado di verificare il JWT firmato e quindi è in grado di identificare l'utente. Bello!
Prima domanda :
Come deve essere archiviato il token JWT sul client? Ci sono, ancora una volta, molte informazioni su questo, e le persone sembrano concordare sul fatto che l'uso Web Storage
sia la strada da percorrere piuttosto che il buon vecchio cookies
. Vogliamo che il JWT sia persistente tra i riavvii del browser, quindi usiamo Local Storage
, non Session Storage
...
Ora l'utente può riavviare il proprio browser e sarà comunque autenticato su example1.com , purché il token JWT non sia scaduto!
Inoltre, se example1.com ha bisogno di fare una richiesta Ajax a un altro dei nostri domini, capisco che la configurazione di CORS lo consentirebbe. Ma il nostro caso d'uso principale non sono le richieste interdominio, bensì una soluzione Single Sign-On !
Pertanto, la domanda principale:
Ora, quale dovrebbe essere il flusso, se l'utente va su example2.com e vogliamo che venga autenticato, utilizzando il token JWT che ha già? Local Storage
non sembra consentire l'accesso tra domini, quindi a questo punto il browser non può leggere il token JWT per effettuare richieste a example2.com !
Dovrebbero :
- L'utente viene reindirizzato nuovamente al server di autenticazione ? Quando l'utente si è autenticato per example1.com , il server di autenticazione potrebbe aver impostato un cookie sull'utente, quindi questa nuova richiesta di autenticazione per example2.com potrebbe utilizzare quel cookie per vedere che l'utente è già autenticato e lo reindirizza immediatamente a example2.com con lo stesso token JWT?
- Oppure il browser, su example2.com , può accedere al token JWT senza dover tornare nuovamente al server di autenticazione ? Vedo che esistono soluzioni di archiviazione incrociata , ma quelle sono ampiamente utilizzate? Sono la soluzione suggerita per un ambiente SSO interdominio?
Non vogliamo niente di stravagante, saremmo contenti della soluzione maggiormente utilizzata!