JWT (Json Web Token) Zielgruppe "aud" versus Client_Id - Was ist der Unterschied?

102

Ich arbeite an der Implementierung von OAuth 2.0 JWT access_token auf meinem Authentifizierungsserver. Ich bin mir jedoch nicht sicher, welche Unterschiede zwischen dem JWT- audAnspruch und dem client_idHTTP-Header-Wert bestehen. Sind sie gleich? Wenn nicht, können Sie den Unterschied zwischen den beiden erklären?

Mein Verdacht ist, dass er audsich auf den oder die Ressourcenserver client_idbeziehen sollte und sich auf eine der vom Authentifizierungsserver erkannten Clientanwendungen beziehen sollte (z. B. Web-App oder iOS-App).

In meinem aktuellen Fall ist mein Ressourcenserver auch mein Web-App-Client.

Chris Swain
quelle

Antworten:

132

Wie sich herausstellte, war mein Verdacht richtig. Der Publikumsanspruch audin einem JWT soll sich auf die Ressourcenserver beziehen, die das Token akzeptieren sollen.

Wie dieser Beitrag einfach sagt:

Die Zielgruppe eines Tokens ist der beabsichtigte Empfänger des Tokens.

Der Zielgruppenwert ist eine Zeichenfolge - normalerweise die Basisadresse der Ressource, auf die zugegriffen wird, z https://contoso.com.

Das client_idin OAuth bezieht sich auf die Clientanwendung, die Ressourcen vom Ressourcenserver anfordert.

Die Client-App (z. B. Ihre iOS-App) fordert eine JWT von Ihrem Authentifizierungsserver an. Dabei werden die client_idund client_secretalle erforderlichen Benutzeranmeldeinformationen übergeben. Der Autorisierungsserver überprüft den Client mit dem client_idund client_secretund gibt eine JWT zurück.

Die JWT enthält einen audAnspruch, der angibt, für welche Ressourcenserver die JWT gültig ist. Wenn das audenthält www.myfunwebapp.com, aber die Client-App versucht, das JWT zu verwenden www.supersecretwebapp.com, wird der Zugriff verweigert, da dieser Ressourcenserver erkennt, dass das JWT nicht dafür bestimmt war.

Chris Swain
quelle
6
Es scheint, dass aud auch die client_id sein kann. siehe 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
Der Ressourcenserver weiß nicht, wohin die Clients die JWT senden. Wie verweigert der Ressourcenserver solchen Datenverkehr von Ihrer iOS-App zu einer anderen URL? Ich glaube nicht, dass du Recht hast.
John Korsnes
Ich würde sagen "Wenn das" aud "" www.webapp.com "enthält, aber die Client-App versucht, das JWT auf" secret.webapp.com "zu verwenden
Katamphetamin
2
Laut RFC identifiziert das Publikum (aud) die Empfänger. Empfänger erhalten Ihre JWT-Token. Wenn Sie eine Web-App haben, kann dies wahrscheinlich contoso.com sein, aber wenn Sie eine Desktop- oder mobile App haben (die sich authentifiziert), hat die Zielgruppe keine URI. Der Aussteller ist derjenige, der JWT-Token generiert, also höchstwahrscheinlich die Adresse des Servers. Laut RFC ist die Verwendung dieses Anspruchs OPTIONAL. Verwenden Sie ihn daher nur, wenn Sie ihn benötigen.
Konrad
1
Eigentlich bin ich verwirrt, was der Unterschied zwischen Publikum und Emittent sein würde.
Andy
62

Der JWT aud(Audience) Claim

Laut RFC 7519 :

Der Anspruch "aud" (Publikum) identifiziert die Empfänger, für die das JWT bestimmt ist. Jeder Auftraggeber, der die JWT verarbeiten möchte, MUSS sich mit einem Wert im Publikumsanspruch identifizieren. Wenn sich der Auftraggeber, der den Anspruch bearbeitet, nicht mit einem Wert im Anspruch "aud" identifiziert, wenn dieser Anspruch vorliegt, MUSS das JWT abgelehnt werden. Im allgemeinen Fall ist der Wert "aud" ein Array von Zeichenfolgen, bei denen zwischen Groß- und Kleinschreibung unterschieden wird und die jeweils einen StringOrURI-Wert enthalten. In dem speziellen Fall, in dem das JWT eine Zielgruppe hat, kann der Wert "aud" eine einzelne Zeichenfolge sein, bei der zwischen Groß- und Kleinschreibung unterschieden wird und die einen StringOrURI-Wert enthält. Die Interpretation der Publikumswerte ist in der Regel anwendungsspezifisch. Die Verwendung dieses Anspruchs ist OPTIONAL.

Der in audder Spezifikation definierte Audience ( ) -Anspruch ist generisch und anwendungsspezifisch. Der Verwendungszweck besteht darin, die beabsichtigten Empfänger des Tokens zu identifizieren. Was ein Empfänger bedeutet, ist anwendungsspezifisch. Ein Zielgruppenwert ist entweder eine Liste von Zeichenfolgen oder eine einzelne Zeichenfolge, wenn nur ein audAnspruch besteht. Der Ersteller des Tokens erzwingt keine audkorrekte Validierung. Der Empfänger ist dafür verantwortlich, zu bestimmen, ob das Token verwendet werden soll.

Was auch immer der Wert ist, wenn ein Empfänger das JWT validiert und validieren möchte, dass das Token für seine Zwecke verwendet werden soll, MUSS er bestimmen, welcher Wert audsich selbst identifiziert, und das Token sollte nur validieren, wenn die deklarierte ID des Empfängers lautet im audAnspruch vorhanden. Es spielt keine Rolle, ob dies eine URL oder eine andere anwendungsspezifische Zeichenfolge ist. Wenn sich mein System beispielsweise audmit der Zeichenfolge identifiziert api3.app.com, sollte es die JWT nur akzeptieren, wenn der audAnspruch api3.app.comin seiner Liste der Zielgruppenwerte enthalten ist.

Natürlich können sich Empfänger dafür entscheiden, dies zu ignorieren aud. Dies ist daher nur dann sinnvoll, wenn ein Empfänger eine positive Bestätigung wünscht, dass das Token speziell für ihn erstellt wurde.

Meine Interpretation basierend auf der Spezifikation ist, dass die audBehauptung nützlich ist, um zweckgebundene JWTs zu erstellen, die nur für bestimmte Zwecke gültig sind. Für ein System kann dies bedeuten, dass ein Token für einige Funktionen gültig sein soll, für andere jedoch nicht. Sie können Token ausgeben, die nur auf eine bestimmte "Zielgruppe" beschränkt sind, während Sie dieselben Schlüssel und denselben Validierungsalgorithmus verwenden.

Da im typischen Fall ein JWT von einem vertrauenswürdigen Dienst generiert und von anderen vertrauenswürdigen Systemen (Systemen, die keine ungültigen Token verwenden möchten) verwendet wird, müssen diese Systeme lediglich die von ihnen verwendeten Werte koordinieren.

Natürlich audist es völlig optional und kann ignoriert werden, wenn Ihr Anwendungsfall dies nicht rechtfertigt. Wenn Sie Token nicht auf die Verwendung durch bestimmte Zielgruppen beschränken möchten oder keines Ihrer Systeme das audToken tatsächlich validiert , ist es nutzlos.

Beispiel: Zugriffs- oder Aktualisierungstoken

Ein erfundenes (aber einfaches) Beispiel, an das ich denken kann, ist vielleicht, dass wir JWTs für Zugriffs- und Aktualisierungstoken verwenden möchten, ohne separate Verschlüsselungsschlüssel und -algorithmen implementieren zu müssen, sondern lediglich sicherstellen möchten, dass Zugriffstoken nicht als Aktualisierungstoken oder Laster validiert werden -versa.

Durch die Verwendung können audwir beim Erstellen dieser Token einen Anspruch refreshauf Aktualisierungstoken und einen Anspruch accessauf Zugriffstoken angeben . Wenn eine Anforderung zum Abrufen eines neuen Zugriffstokens von einem Aktualisierungstoken gestellt wird, müssen wir überprüfen, ob das Aktualisierungstoken ein echtes Aktualisierungstoken war. Die audoben beschriebene Validierung zeigt an, ob das Token tatsächlich ein gültiges Aktualisierungstoken war, indem speziell nach einem Anspruch von refreshin gesucht wird aud.

OAuth Client ID vs. JWT audClaim

Die OAuth-Client-ID ist völlig unabhängig und steht in keinem direkten Zusammenhang mit JWT- audAnsprüchen. Aus der Sicht von OAuth sind die Token undurchsichtige Objekte.

Die Anwendung, die diese Token akzeptiert, ist für das Parsen und Überprüfen der Bedeutung dieser Token verantwortlich. Ich sehe nicht viel Wert darin, die OAuth-Client-ID in einem JWT- audAnspruch anzugeben .

Kekoa
quelle
3
Ich bin im Großen und Ganzen ein bisschen verschwommen "muss sich identifizieren". RFC7519 ist voll von solchen unerklärlichen Bits, zusammen mit vagen Anspielungen auf andere Authentifizierungssysteme, wo wahrscheinlich die richtige Interpretation der Standard-Anspruchsfelder zu finden ist. Ehrlich gesagt hätte der RFC, so nützlich er auch sein mag, in einem solchen Zustand niemals die Entwurfsphase verlassen dürfen.
Chuck Adams
1
@ChuckAdams Ich habe bearbeitet, um meine Gedanken zu klären. Ich bin damit einverstanden, dass der RFC sehr vage ist, insbesondere in Bezug auf die "Standardansprüche" und wie / wann sie verwendet werden sollen.
Kekoa
2
Wir haben derzeit die gleiche Diskussion über die Verwendung des Aud-Felds und ich stimme zu, dass es den Empfänger (derjenige, der das Token validiert und akzeptiert) und nicht die client_id (derjenige, der nach dem Token gefragt hat, um darauf zu reagieren) enthalten soll im Namen des Nutzers).
Hardysim
4

Wenn Sie hierher gekommen sind, um OpenID Connect (OIDC) zu suchen: OAuth 2.0! = OIDC

Ich erkenne , dass dies für oauth markiert 2.0 und NICHT OIDC, jedoch gibt es häufig eine Verschmelzung zwischen den zwei Standards , da beide Standards können JWTs und die Verwendung audAnspruch. Und eines (OIDC) ist im Grunde eine Erweiterung des anderen (OAUTH 2.0). (Ich bin über diese Frage gestolpert und habe selbst nach OIDC gesucht.)

OAuth 2.0-Zugriffstoken ##

Für OAuth 2.0- Zugriffstoken decken vorhandene Antworten dies ziemlich gut ab. Zusätzlich ist hier ein relevanter Abschnitt aus OAuth 2.0 Framework (RFC 6749)

Für öffentliche Clients, die implizite Flows verwenden, bietet diese Spezifikation keine Methode für den Client, um zu bestimmen, an welchen Client ein Zugriffstoken ausgegeben wurde.
... Die
Authentifizierung von Ressourcenbesitzern gegenüber Clients ist für diese Spezifikation nicht zulässig. Jede Spezifikation, die den Autorisierungsprozess als eine Form der delegierten Endbenutzerauthentifizierung an den Client verwendet (z. B. Anmeldedienst eines Drittanbieters), darf den impliziten Ablauf NICHT ohne zusätzliche Sicherheitsmechanismen verwenden, mit denen der Client bestimmen kann, ob der Zugriff erfolgt Das Token wurde für seine Verwendung ausgestellt (z. B. durch Einschränkung des Zugriffstokens durch die Zielgruppe).

OIDC-ID-Token ##

OIDC verfügt zusätzlich zu den Zugriffstoken über ID- Token. Die OIDC-Spezifikation bezieht sich ausdrücklich auf die Verwendung des audAnspruchs in ID-Token. ( openid-connect-core-1.0 )

aud
ERFORDERLICH. Zielgruppe (n), für die dieses ID-Token bestimmt ist. Es MUSS die OAuth 2.0 client_id der Relying Party als Publikumswert enthalten. Es kann auch Bezeichner für andere Zielgruppen enthalten. Im allgemeinen Fall ist der aud-Wert ein Array von Zeichenfolgen, bei denen zwischen Groß- und Kleinschreibung unterschieden wird. Im allgemeinen Sonderfall, wenn es eine Zielgruppe gibt, kann der Aud-Wert eine Zeichenfolge sein, bei der die Groß- und Kleinschreibung beachtet wird.

Darüber hinaus gibt OIDC den azpAnspruch an, der in Verbindung mit audwhen verwendet audwird, der mehr als einen Wert hat.

azp
OPTIONAL. Autorisierte Partei - die Partei, an die das ID-Token ausgestellt wurde. Falls vorhanden, MUSS es die OAuth 2.0-Client-ID dieser Partei enthalten. Dieser Anspruch wird nur benötigt, wenn das ID-Token einen einzigen Zielgruppenwert hat und sich diese Zielgruppe von der autorisierten Partei unterscheidet. Es kann auch dann aufgenommen werden, wenn die autorisierte Partei mit dem einzigen Publikum identisch ist. Der azp-Wert ist eine Zeichenfolge, bei der zwischen Groß- und Kleinschreibung unterschieden wird und die einen StringOrURI-Wert enthält.

Joseph A.
quelle
1
Nur um eines zu beachten: Oauth2 erzwingt nicht die Verwendung von JWT.
Zoran
1

Obwohl dies alt ist, denke ich, dass die Frage auch heute noch gültig ist

Mein Verdacht ist, dass aud auf die Ressourcenserver verweisen sollte und die client_id auf eine der vom Authentifizierungsserver erkannten Clientanwendungen verweisen sollte

Ja, aud sollte sich auf eine Token-konsumierende Partei beziehen. Und client_id bezieht sich auf eine Token erhaltende Partei.

In meinem aktuellen Fall ist mein Ressourcenserver auch mein Web-App-Client.

Im OP-Szenario gehören sowohl die Web-App als auch der Ressourcenserver derselben Partei an. Das bedeutet also, dass Kunde und Publikum gleich sind. Es kann jedoch Situationen geben, in denen dies nicht der Fall ist.

Stellen Sie sich ein SPA vor, das eine OAuth-geschützte Ressource verbraucht. In diesem Szenario ist SPA der Client. Geschützte Ressource ist die Zielgruppe des Zugriffstokens.

Dieses zweite Szenario ist interessant. Es gibt einen Arbeitsentwurf mit dem Namen " Ressourcenindikatoren für OAuth 2.0 ", in dem erläutert wird, wo Sie die beabsichtigte Zielgruppe in Ihrer Autorisierungsanfrage definieren können. Das resultierende Token wird also auf die angegebene Zielgruppe beschränkt. Außerdem verwendet Azure OIDC einen ähnlichen Ansatz, bei dem die Registrierung von Ressourcen und die Authentifizierungsanforderung Ressourcenparameter enthalten, um die beabsichtigte Zielgruppe für Zugriffstoken zu definieren. Solche Mechanismen ermöglichen OAuth-Adpotationen eine Trennung zwischen Client und Token-konsumierender (Zielgruppen-) Partei.

Kavindu Dodanduwa
quelle