Pubblico JWT (Json Web Token) "aud" rispetto a Client_Id - Qual è la differenza?


103

Sto lavorando all'implementazione di OAuth 2.0 JWT access_token nel mio server di autenticazione. Tuttavia, non sono chiaro quali siano le differenze tra l'attestazione JWT aude il client_idvalore dell'intestazione HTTP. Sono gli stessi? In caso contrario, puoi spiegare la differenza tra i due?

Il mio sospetto è che auddovrebbe fare riferimento ai server di risorse e client_iddovrebbe fare riferimento a una delle applicazioni client riconosciute dal server di autenticazione (ad es. App web o app iOS).

Nel mio caso attuale, il mio server di risorse è anche il mio client di app web.

Risposte:


132

A quanto pare, i miei sospetti erano giusti. Il pubblicoaud in un JWT intende fare riferimento ai Resource Server che dovrebbero accettare il token.

Come dice semplicemente questo post:

Il pubblico di un token è il destinatario previsto del token.

Il valore destinatario è una stringa, in genere l'indirizzo di base della risorsa a cui si accede, ad esempio https://contoso.com.

Il client_id OAuth si riferisce all'applicazione client che richiederà risorse dal Resource Server.

L'app client (ad esempio la tua app iOS) richiederà un JWT dal tuo server di autenticazione. In tal modo, passa sia client_ide client_secretinsieme a tutte le credenziali utente che potrebbero essere richieste. Il server di autorizzazione convalida il client utilizzando client_ideclient_secret e restituisce un JWT.

Il JWT conterrà audun'attestazione che specifica per quali Resource Server è valido il JWT. Se audcontiene www.myfunwebapp.com, ma l'app client tenta di utilizzare il JWT www.supersecretwebapp.com, l'accesso verrà negato perché quel Resource Server vedrà che il JWT non è stato progettato per esso.


6
Sembra che anche aud possa essere client_id. vedi tools.ietf.org/id/draft-hunt-oauth-v2-user-a4c-01.txt aud REQUIRED for session_token. Contains the client_id of the client receiving the assertion.
themihai

1
Il server di risorse non sa dove i client inviano il JWT. In che modo il server delle risorse negherà tale traffico dalla tua app iOS a qualche altro URL? Non penso tu abbia ragione.
John Korsnes

Direi "Se" aud "contiene" www.webapp.com ", ma l'app client cerca di utilizzare il JWT su" secret.webapp.com ""
catamphetamine

2
RFC afferma che il pubblico (aud) identifica i destinatari. I destinatari ricevono i tuoi token JWT. Se si dispone di un'app Web, probabilmente può essere contoso.com, ma se si dispone di un'app desktop o mobile (che esegue l'autenticazione), il pubblico non ha alcun URI. L'emittente è chi genera i token JWT, quindi molto probabilmente l'indirizzo del server. RFC afferma che l'utilizzo di questa affermazione è FACOLTATIVO, quindi usalo solo quando ne hai bisogno.
Konrad

1
In realtà sono confuso quale sarebbe la differenza tra pubblico ed emittente.
Andy

62

Il JWT aud (pubblico)

Secondo RFC 7519 :

La dichiarazione "aud" (audience) identifica i destinatari a cui è destinato il JWT. Ogni preside che intende elaborare il JWT DEVE identificarsi con un valore nell'affermazione del pubblico. Se il principale che elabora la richiesta non si identifica con un valore nella dichiarazione "aud" quando questa è presente, la JWT DEVE essere respinta. Nel caso generale, il valore "aud" è un array di stringhe sensibili al maiuscolo / minuscolo, ciascuna contenente un valore StringOrURI. Nel caso speciale in cui il JWT ha un destinatario, il valore "aud" PU essere una singola stringa con distinzione tra maiuscole e minuscole contenente un valore StringOrURI. L'interpretazione dei valori del pubblico è generalmente specifica dell'applicazione. L'utilizzo di questa affermazione è FACOLTATIVO.

Il pubblico (aud affermazione ) come definita dalla specifica è generica ed è specifica dell'applicazione. L'utilizzo previsto è identificare i destinatari previsti del token. Ciò che un destinatario intende è specifico dell'applicazione. Un valore destinatario è un elenco di stringhe o può essere una singola stringa se è presente una sola audattestazione. Il creatore del token non impone che audsia convalidato correttamente, è responsabilità del destinatario determinare se il token deve essere utilizzato.

Qualunque sia il valore, quando un destinatario sta convalidando il JWT e desidera convalidare che il token doveva essere utilizzato per i suoi scopi, DEVE determinare quale valore si audidentifica e il token dovrebbe convalidare solo se l'ID dichiarato del destinatario è presente nel audreclamo. Non importa se si tratta di un URL o di un'altra stringa specifica dell'applicazione. Ad esempio, se il mio sistema decide di identificarsi audcon la stringa:api3.app.com allora dovrebbe accettare il JWT solo se la auddichiarazione contiene api3.app.comnel suo elenco di valori del pubblico.

Naturalmente i destinatari possono scegliere di ignorare aud , quindi questo è utile solo se un destinatario desidera una convalida positiva che il token è stato creato appositamente per esso.

La mia interpretazione basata sulla specifica è che l' audaffermazione è utile per creare JWT appositamente costruiti che sono validi solo per determinati scopi. Per un sistema questo può significare che desideri che un token sia valido per alcune funzionalità, ma non valido per altre. Potresti emettere token che sono limitati solo a un determinato "pubblico", pur utilizzando le stesse chiavi e algoritmo di convalida.

Poiché nel caso tipico un JWT viene generato da un servizio affidabile e utilizzato da altri sistemi affidabili (sistemi che non vogliono utilizzare token non validi), questi sistemi devono semplicemente coordinare i valori che useranno.

Ovviamente audè completamente opzionale e può essere ignorato se il tuo caso d'uso non lo garantisce. Se non desideri limitare l'utilizzo dei token da parte di un pubblico specifico, o nessuno dei tuoi sistemi convaliderà effettivamente il fileaud token, allora è inutile.

Esempio: token di accesso e aggiornamento

Un esempio artificioso (ma semplice) a cui posso pensare è che forse vogliamo utilizzare JWT per l'accesso e i token di aggiornamento senza dover implementare chiavi di crittografia e algoritmi separati, ma semplicemente vogliamo assicurarci che i token di accesso non vengano convalidati come token di aggiornamento o vice -versa.

Usando audpossiamo specificare una richiesta di refreshtoken di aggiornamento e una richiesta di accesstoken di accesso alla creazione di questi token. Quando viene effettuata una richiesta per ottenere un nuovo token di accesso da un token di aggiornamento, è necessario verificare che il token di aggiornamento fosse un token di aggiornamento autentico. La audconvalida come descritto sopra ci dirà se il token era effettivamente un token di aggiornamento valido cercando specificamente un'attestazione di refreshinaud .

ID client OAuth e JWT aud rivendicazione

L'ID client OAuth non è completamente correlato e non ha alcuna correlazione diretta con JWT aud attestazioni . Dal punto di vista di OAuth, i token sono oggetti opachi.

L'applicazione che accetta questi token è responsabile dell'analisi e della convalida del significato di questi token. Non vedo molto valore nello specificare l'ID client OAuth all'interno di un'attestazione JWT aud.


3
Sono un po 'sfocato nel complesso "deve identificarsi". RFC7519 è pieno di bit inspiegabili come questo, insieme a vaghe allusioni ad altri sistemi di autenticazione, che è probabile che si trovi la corretta interpretazione dei campi delle dichiarazioni standard. Francamente la RFC, per quanto utile possa essere, non avrebbe mai dovuto lasciare la fase di bozza in un tale stato.
Chuck Adams

1
@ChuckAdams ho modificato per chiarire i miei pensieri. Sono d'accordo che la RFC sia molto vaga, specialmente riguardo alle "affermazioni standard" e su come / quando usarle.
Kekoa

2
Al momento abbiamo la stessa discussione su come utilizzare il campo aud e sono d'accordo che debba contenere il destinatario (colui che convalida e accetta il token) e non il client_id (colui che ha chiesto al token di agire su per conto dell'utente).
hardysim

4

Se sei arrivato qui cercando OpenID Connect (OIDC): OAuth 2.0! = OIDC

Riconosco che questo è etichettato per oauth 2.0 e NON OIDC, tuttavia c'è spesso una confusione tra i 2 standard poiché entrambi gli standard possono utilizzare JWT e l' audaffermazione. E uno (OIDC) è fondamentalmente un'estensione dell'altro (OAUTH 2.0). (Mi sono imbattuto in questa domanda cercando me stesso OIDC.)

Token di accesso OAuth 2.0 ##

Per i token di accesso OAuth 2.0 , le risposte esistenti lo coprono abbastanza bene. Inoltre, ecco una sezione pertinente di OAuth 2.0 Framework (RFC 6749)

Per i client pubblici che utilizzano flussi impliciti, questa specifica non fornisce alcun metodo per il client per determinare a quale client è stato emesso un token di accesso.
... L'
autenticazione dei proprietari delle risorse sui client non rientra nell'ambito di questa specifica. Qualsiasi specifica che utilizza il processo di autorizzazione come una forma di autenticazione dell'utente finale delegata al client (ad esempio, servizio di accesso di terze parti) NON DEVE utilizzare il flusso implicito senza meccanismi di sicurezza aggiuntivi che consentirebbero al client di determinare se l'accesso il token è stato emesso per il suo utilizzo (ad esempio, il pubblico che limita il token di accesso).

Token ID OIDC ##

OIDC ha token ID oltre ai token di accesso. La specifica OIDC è esplicita sull'uso dell'attestazione audnei token ID. ( openid-connect-core-1.0 )

aud
RICHIESTO. Pubblico (i) a cui è destinato questo token ID. DEVE contenere OAuth 2.0 client_id della Relying Party come valore del pubblico. Può contenere anche identificatori per altri segmenti di pubblico. Nel caso generale, il valore aud è un array di stringhe sensibili al maiuscolo / minuscolo. Nel caso speciale comune in cui è presente un destinatario, il valore aud PU essere una singola stringa sensibile al maiuscolo / minuscolo.

inoltre OIDC specifica l'attestazione azpche viene utilizzata insieme a audquando audha più di un valore.

azp
FACOLTATIVO. Parte autorizzata: la parte a cui è stato rilasciato il token ID. Se presente, DEVE contenere l'ID client OAuth 2.0 di questa parte. Questo reclamo è necessario solo quando il token ID ha un valore di pubblico singolo e tale pubblico è diverso dalla parte autorizzata. Può essere incluso anche quando la parte autorizzata è la stessa del pubblico unico. Il valore azp è una stringa con distinzione tra maiuscole e minuscole contenente un valore StringOrURI.


1
Solo per notare una cosa: Oauth2 non forza l'uso di JWT.
zoran

1

Anche se questo è vecchio, penso che la domanda sia valida anche oggi

Il mio sospetto è che aud dovrebbe fare riferimento ai server di risorse e client_id dovrebbe fare riferimento a una delle applicazioni client riconosciute dal server di autenticazione

Sì, aud dovrebbe fare riferimento alla festa che consuma token. E client_id si riferisce alla parte che ottiene il token.

Nel mio caso attuale, il mio server di risorse è anche il mio client di app web.

Nello scenario dell'OP, l'app Web e il server di risorse appartengono entrambi alla stessa parte. Quindi questo significa che cliente e pubblico devono essere gli stessi. Ma ci possono essere situazioni in cui non è così.

Pensa a una SPA che consuma una risorsa protetta da OAuth. In questo scenario SPA è il client. La risorsa protetta è il pubblico del token di accesso.

Questo secondo scenario è interessante. È disponibile una bozza di lavoro denominata " Indicatori di risorse per OAuth 2.0 " che spiega dove è possibile definire il pubblico previsto nella richiesta di autorizzazione. Quindi il token risultante sarà limitato al pubblico specificato. Inoltre, Azure OIDC usa un approccio simile in cui consente la registrazione delle risorse e consente alla richiesta di autenticazione di contenere il parametro della risorsa per definire il pubblico previsto del token di accesso. Tali meccanismi consentono agli annunci OAuth di avere una separazione tra il client e la parte che consuma token (pubblico).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.