OAuth2 JWT Crittografia per token con ambiti a più server di risorse

2

Nel contesto di una distribuzione OAuth2, vorrei concedere a un client un JWT crittografato che abbia scopi diversi da diversi server di risorse e possa essere decifrato da ciascun server di risorse indipendentemente dal server di autorizzazione che condivide un segreto tra tutti i server di risorse.

Esistono specifiche da risolvere per questo scenario?

I requisiti nella sezione successiva specificano alcuni vincoli rimanenti.

Requisiti

  • La decrittografia deve essere eseguita sul livello del server di risorse, senza dover reindirizzare il token a un server di autorizzazione (tramite endpoint Intranet di Token o altro).
  • I server di risorse devono disporre di chiavi segrete distinte al fine di limitare la superficie di attacco che potrebbe compromettere qualsiasi chiave segreta.
  • Il JWT deve utilizzare il formato compatto per rimanere compatibile con OpenID Connect (è vero oppure può utilizzare OpenID Connect con i formati di serializzazione JSON JWT (JWS / JWE)?)

Esempio di caso d'uso

Traccerò un caso d'uso per la concessione del codice di autorizzazione ( link ) per dimostrare ulteriormente il mio caso d'uso.

  • Come utente registrato di un server di autorizzazione
  • Quando visito per la prima volta un'applicazione client OAuth2 registrata (con il mio agente utente)
  • Quindi dovrei essere reindirizzato al server di autorizzazione con la query richiesta parametri param per la concessione del codice di autorizzazione (compresi gli ambiti="photos.read, photos.write, friends.read")
  • E dovrei vedere una finestra di dialogo di autorizzazione che richiede l'accesso delegato ai seguenti servizi:

    • Leggi le tue foto
    • Carica foto per tuo conto
    • Leggi i tuoi amici
  • Quando faccio clic su "Autorizza"

  • Quindi dovrei essere reindirizzato all'applicazione client OAuth2 registrata con un codice di autorizzazione
  • Quando il sistema dell'applicazione client OAuth2 utilizzava il codice di autorizzazione per richiedere un token
  • Quindi il sistema dell'applicazione client OAuth2 dovrebbe ricevere un token con i seguenti ambiti:

    • photos.read
    • photos.write
    • friends.read

(...)

Nella mia implementazione di questo sistema, la "Risorsa Foto" e la "Risorsa amici" vivono su due distinti server di risorse. Come accennato in precedenza, l'obiettivo è che questi server di risorse non condividono chiavi segrete identiche.

Soluzione possibile

  1. JWE JSON Serializzazione con più destinatari ( link ). Ciò viola i requisiti di cui sopra poiché utilizza il metodo di serializzazione JWE JWE piuttosto che il formato compatto JWE. Secondo la domanda di cui sopra, sembrerebbe che OpenID Connect possa usare solo il formato JWT Compact. Se la mia ipotesi è errata qui, allora forse questa è una soluzione ragionevole?

Grazie per aver letto questo. Apprezzerei molto qualsiasi suggerimento o suggerimento.

    
posta Will Sulzer 12.04.2016 - 09:59
fonte

1 risposta

3

Ho letto la tua domanda un paio di volte perché mi sono confrontato con un "problema" come il tuo. La soluzione presentata da te, utilizzando OAuth2 con OpenID Connect e JWT come token è corretta. Ho scritto su Medium un articolo dove ho descritto in dettaglio come utilizzare OAuth2 con OpenID Connect. Se hai qualche domanda, per favore chiedimi.

LATER EDIT

Uno dei punti deboli di OAuth2 è che non esiste un modo prescritto per il server di risorse per convalidare il token di accesso o per utilizzare il token di accesso per stabilire l'identità dell'utente.

Google e altri provider OAuth2 hanno risolto questo problema fornendo un endpoint TokenInfo. I server di risorse possono passare il token di accesso a questo endpoint e ottenere informazioni sulla validità del token, sull'identità dell'utente, sull'ambito del token e sul tempo di scadenza. Nel mio caso questo endpoint corrisponde al server di autorizzazione.

QuestoconcettoèstatoampliatoinOpenIDConnectconl'introduzionedeltokenID.IltokenIDèuntokenfirmatoepotenzialmentecrittografatochecontienel'identitàdell'utenteetuttelerivendicazionicherientranonell'ambito.

IltokenIDèuntokenWebJSON(JWT)checontienedatidiidentità.VieneconsumatodalClienteeutilizzatoperottenereinformazioniutentecomenomeutente,e-mailecosìvia.Ciòèutileanchequandosidisponediunacatenadiserverdirisorseeunserverdirisorsepuòessereunclientdiunaltroserverdirisorse.

LafunzioneJWToffrealleapplicazioniclienteaiserverdirisorselapossibilitàdiottenereinformazioniinmodosicurosull'utentedirettamentesenzadovercontattareilserverdiautorizzazioneognivolta.

Se si desidera impedire l'emissione di token di accesso troppo ampi, è possibile fornire un controllo di autorizzazione in ogni punto della catena. Un server di risorse può essere un client per il server di autorizzazione, presentare il suo JWT e richiedere una nuova JWT per il successivo server di risorse nella catena.

    
risposta data 29.12.2017 - 15:43
fonte

Leggi altre domande sui tag