JWT (Json Web Token) Odbiorcy „aud” a Client_Id - Jaka jest różnica?

104

Pracuję nad wdrożeniem tokena access_token JWT OAuth 2.0 na moim serwerze uwierzytelniającym. Ale nie jestem pewien, jakie są różnice między audżądaniem JWT a client_idwartością nagłówka HTTP. Czy oni są tacy sami? Jeśli nie, czy możesz wyjaśnić różnicę między nimi?

Podejrzewam, że audpowinno to odnosić się do serwera (ów) zasobów, a client_idpowinno odnosić się do jednej z aplikacji klienckich rozpoznawanych przez serwer uwierzytelniający (np. Aplikacja internetowa lub aplikacja iOS).

W moim obecnym przypadku mój serwer zasobów jest również moim klientem aplikacji internetowej.

Chris Swain
źródło

Odpowiedzi:

134

Jak się okazuje, moje podejrzenia były słuszne. audŻądanie odbiorców w tokenie JWT ma odnosić się do serwerów zasobów, które powinny akceptować token.

Jak to po prostu ujmuje ten post:

Odbiorcą tokena jest zamierzony odbiorca tokena.

Wartością odbiorców jest ciąg - zazwyczaj jest to adres bazowy zasobu, do którego uzyskiwany jest dostęp, na przykład https://contoso.com.

client_idW OAuth odnosi się do aplikacji klienckiej, która będzie wzywającego środków z zasobów serwera.

Aplikacja kliencka (np. Aplikacja na iOS) zażąda tokenów JWT z serwera uwierzytelniania. Robiąc to, przekazuje to client_idi client_secretwraz z wszelkimi poświadczeniami użytkownika, które mogą być wymagane. Autoryzacja serwera sprawdza kliencie za pomocą procesora client_idi client_secreti zwraca JWT.

Token JWT będzie zawierał audżądanie określające, dla których serwerów zasobów token JWT jest ważny. Jeśli aplikacja kliencka audzawiera www.myfunwebapp.com, ale aplikacja kliencka spróbuje użyć tokena JWT włączona www.supersecretwebapp.com, dostęp zostanie zablokowany, ponieważ ten serwer zasobów zobaczy, że token JWT nie jest do niego przeznaczony.

Chris Swain
źródło
6
Wygląda na to, że aud może być również client_id. zobacz 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
Serwer zasobów nie wie, gdzie klienci wysyłają tokeny JWT. W jaki sposób serwer zasobów zablokuje taki ruch z aplikacji na iOS do innego adresu URL? Myślę, że nie masz racji.
John Korsnes
Powiedziałbym „Jeśli„ aud ”zawiera„ www.webapp.com ”, ale aplikacja kliencka próbuje użyć tokena JWT na„ secret.webapp.com ””
catamfetamina,
2
RFC mówi, że publiczność (audyt) identyfikuje odbiorców. Odbiorcy otrzymują Twoje tokeny JWT. Jeśli masz aplikację internetową, prawdopodobnie może to być contoso.com, ale jeśli masz aplikację klasyczną lub mobilną (która uwierzytelnia), odbiorcy nie mają żadnego identyfikatora URI. Wystawca generuje tokeny JWT, więc najprawdopodobniej adres serwera. RFC mówi, że użycie tego oświadczenia jest OPCJONALNE, więc używaj go tylko wtedy, gdy tego potrzebujesz.
Konrad
1
Właściwie nie wiem, jaka byłaby różnica między odbiorcą a emitentem.
Andy
65

audRoszczenie dotyczące JWT (odbiorców)

Zgodnie z RFC 7519 :

Oświadczenie „aud” (publiczność) identyfikuje odbiorców, dla których JWT jest przeznaczony. Każdy podmiot zamierzający przetworzyć JWT MUSI utożsamiać się z wartością w roszczeniu odbiorców. Jeżeli główny rozpatrujący roszczenie nie identyfikuje się z wartością w roszczeniu „aud”, gdy roszczenie to występuje, wówczas JWT MUSI zostać odrzucony. W ogólnym przypadku wartość „aud” jest tablicą łańcuchów uwzględniających wielkość liter, z których każdy zawiera wartość StringOrURI. W szczególnym przypadku, gdy tokena JWT ma jedną grupę odbiorców, wartość „aud” MOŻE być pojedynczym łańcuchem uwzględniającym wielkość liter i zawierającym wartość StringOrURI. Interpretacja wartości odbiorców jest na ogół specyficzna dla aplikacji. Użycie tego oświadczenia jest OPCJONALNE.

audOświadczenie Audience ( ) zdefiniowane w specyfikacji jest ogólne i jest specyficzne dla aplikacji. Zamierzonym zastosowaniem jest identyfikacja zamierzonych odbiorców tokena. To, co oznacza odbiorca, zależy od aplikacji. Wartość odbiorców to lista ciągów lub pojedynczy ciąg, jeśli istnieje tylko jedno audroszczenie. Twórca tokena nie wymusza tego, czy audzostał on poprawnie zweryfikowany, odpowiedzialność za określenie, czy token powinien zostać użyty, spoczywa na odbiorcy.

Niezależnie od wartości, gdy odbiorca waliduje token JWT i chce sprawdzić, czy token był przeznaczony do jego celów, MUSI określić, jaka wartość audidentyfikuje się sam, a token powinien sprawdzać tylko wtedy, gdy zadeklarowany identyfikator odbiorcy to obecny w audroszczeniu. Nie ma znaczenia, czy jest to adres URL, czy inny ciąg znaków specyficzny dla aplikacji. Na przykład, jeśli mój system zdecyduje, że identyfikuje się audza pomocą ciągu znaków: api3.app.comwówczas powinien akceptować token JWT tylko wtedy, gdy audroszczenie zawiera api3.app.comlistę wartości odbiorców.

Oczywiście odbiorcy mogą zdecydować się zignorować aud, więc jest to przydatne tylko wtedy, gdy odbiorca chciałby pozytywnej weryfikacji, że token został stworzony specjalnie dla niego.

Moja interpretacja oparta na specyfikacji jest taka, że audtwierdzenie jest przydatne do tworzenia specjalnie skonstruowanych tokenów JWT, które są ważne tylko do określonych celów. W przypadku jednego systemu może to oznaczać, że chcesz, aby token był ważny dla niektórych funkcji, ale nie jest ważny dla innych. Możesz wydawać tokeny, które są ograniczone tylko do określonej „grupy docelowej”, nadal używając tych samych kluczy i algorytmu weryfikacji.

Ponieważ w typowym przypadku token JWT jest generowany przez zaufaną usługę i używany przez inne zaufane systemy (systemy, które nie chcą używać nieprawidłowych tokenów), systemy te muszą po prostu koordynować wartości, których będą używać.

Oczywiście audjest to całkowicie opcjonalne i można je zignorować, jeśli Twój przypadek użycia tego nie gwarantuje. Jeśli nie chcesz ograniczać tokenów do używania przez określonych odbiorców lub żaden z Twoich systemów faktycznie nie zweryfikuje audtokenu, jest on bezużyteczny.

Przykład: Tokeny dostępu a odświeżanie

Jeden wymyślny (ale prosty) przykład, o którym mogę pomyśleć, jest taki, że być może chcemy używać tokeny JWT do dostępu i odświeżania tokenów bez konieczności implementowania oddzielnych kluczy szyfrowania i algorytmów, ale po prostu chcemy mieć pewność, że tokeny dostępu nie będą weryfikowane jako tokeny odświeżania lub wady -versa.

Używając audmożemy określić żądanie refreshdla tokenów odświeżania i żądanie accessdla tokenów dostępu podczas tworzenia tych tokenów. Gdy zostanie wysłane żądanie uzyskania nowego tokenu dostępu z tokenu odświeżania, musimy sprawdzić, czy token odświeżania był prawdziwym tokenem odświeżania. audWalidacja jak opisano powyżej powie nam, czy token był rzeczywiście ważny token odświeżania patrząc specjalnie na roszczenie refreshw aud.

Identyfikator klienta OAuth a audroszczenie JWT

Identyfikator klienta OAuth jest całkowicie niepowiązany i nie ma bezpośredniego związku z audoświadczeniami JWT . Z punktu widzenia OAuth tokeny są obiektami nieprzezroczystymi.

Aplikacja, która akceptuje te tokeny, jest odpowiedzialna za analizowanie i sprawdzanie znaczenia tych tokenów. Nie widzę dużej wartości w określaniu identyfikatora klienta OAuth w audroszczeniu JWT .

Kekoa
źródło
3
Jestem trochę niejasny, jeśli chodzi o to, że „musi się zidentyfikować”. RFC7519 jest pełen takich niewyjaśnionych bitów, wraz z niejasnymi aluzjami do innych systemów uwierzytelniania, co jest prawdopodobne, w których można znaleźć właściwą interpretację standardowych pól oświadczeń. Szczerze mówiąc, dokument RFC, choć może być przydatny, nigdy nie powinien był opuszczać etapu projektu w takim stanie.
Chuck Adams
1
@ChuckAdams Edytowałem, aby wyjaśnić swoje myśli. Zgadzam się, że specyfikacja RFC jest bardzo niejasna, szczególnie w odniesieniu do „standardowych oświadczeń” oraz tego, jak / kiedy ich używać.
Kekoa
2
Obecnie prowadzimy tę samą dyskusję na temat korzystania z pola aud i zgadzam się, że ma ono zawierać odbiorcę (tego, który weryfikuje i akceptuje token), a nie client_id (tego, który poprosił o token do działania w imieniu użytkownika).
hardysim
4

Jeśli przyszedłeś tutaj, szukając OpenID Connect (OIDC): OAuth 2.0! = OIDC

Rozumiem, że jest to oznaczone jako oauth 2.0 i NIE OIDC, jednak często występuje konflikt między tymi dwoma standardami, ponieważ oba standardy mogą używać JWT i audoświadczenia. A jeden (OIDC) jest w zasadzie rozszerzeniem drugiego (OAUTH 2.0). (Sam natknąłem się na to pytanie, szukając OIDC.)

Tokeny dostępu OAuth 2.0 ##

W przypadku tokenów dostępu OAuth 2.0 istniejące odpowiedzi całkiem dobrze to obejmują. Dodatkowo tutaj jest jedna odpowiednia sekcja z OAuth 2.0 Framework (RFC 6749)

W przypadku klientów publicznych korzystających z niejawnych przepływów ta specyfikacja nie zawiera żadnej metody umożliwiającej klientowi określenie, do którego klienta wystawiono token dostępu.
...
Uwierzytelnianie właścicieli zasobów na klientach jest poza zakresem tej specyfikacji. Żadna specyfikacja, która wykorzystuje proces autoryzacji jako formę delegowanego uwierzytelniania użytkownika końcowego dla klienta (np. Usługa logowania innej firmy) NIE MOŻE używać niejawnego przepływu bez dodatkowych mechanizmów bezpieczeństwa, które umożliwiłyby klientowi określenie, czy dostęp token został wydany na jego użytek (np. publiczność - ograniczenie dostępu do tokena).

Tokeny identyfikacyjne OIDC ##

OIDC oprócz tokenów dostępu posiada również tokeny identyfikacyjne . Specyfikacja OIDC jasno określa użycie audoświadczenia w tokenach identyfikacyjnych. ( openid-connect-core-1.0 )


WYMAGANY audyt . Odbiorcy, dla których jest przeznaczony ten token identyfikacyjny. MUSI zawierać identyfikator klienta OAuth 2.0 strony ufającej jako wartość publiczności. MOŻE zawierać także identyfikatory dla innych odbiorców. W ogólnym przypadku wartość aud jest tablicą ciągów uwzględniających wielkość liter. W typowym, specjalnym przypadku, gdy jest jedna publiczność, wartość aud MOŻE być łańcuchem uwzględniającym pojedynczą wielkość liter.

ponadto OIDC określa azpoświadczenie, które jest używane w połączeniu z, audgdy audma więcej niż jedną wartość.

azp
OPCJONALNIE. Uprawniony - strona, której wydano Identyfikator. Jeśli jest obecny, MUSI zawierać identyfikator klienta OAuth 2.0 tej strony. To żądanie jest potrzebne tylko wtedy, gdy token identyfikatora ma jedną wartość odbiorcy i ta grupa odbiorców jest inna niż upoważniona strona. MOŻE zostać uwzględnione nawet wtedy, gdy uprawnioną stroną jest ta sama jedyna publiczność. Wartość azp jest ciągiem uwzględniającym wielkość liter i zawierającym wartość StringOrURI.

Joseph A.
źródło
1
Wystarczy zwrócić uwagę na jedną rzecz: Oauth2 nie wymusza użycia JWT.
zoran
1

Chociaż to jest stare, myślę, że pytanie jest aktualne nawet dzisiaj

Podejrzewam, że audyt powinien odnosić się do serwerów zasobów, a identyfikator_klienta powinien odnosić się do jednej z aplikacji klienckich rozpoznawanych przez serwer uwierzytelniania

Tak, audyt powinien odnosić się do strony konsumenta tokenów. A client_id odnosi się do strony otrzymującej token.

W moim obecnym przypadku mój serwer zasobów jest również moim klientem aplikacji internetowej.

W scenariuszu OP, aplikacja internetowa i serwer zasobów należą do tej samej strony. Oznacza to, że klient i publiczność są tacy sami. Ale mogą wystąpić sytuacje, w których tak nie jest.

Pomyśl o SPA, które zużywa zasób chroniony przez OAuth. W tym scenariuszu klientem jest SPA. Chroniony zasób to odbiorca tokenu dostępu.

Ten drugi scenariusz jest interesujący. Istnieje robocza wersja robocza o nazwie „ Wskaźniki zasobów dla OAuth 2.0 ”, która wyjaśnia, gdzie można zdefiniować docelowych odbiorców w żądaniu autoryzacji. Zatem wynikowy token będzie ograniczony do określonej grupy odbiorców. Ponadto Azure OIDC używa podobnego podejścia, w którym umożliwia rejestrację zasobów i zezwala na żądanie uwierzytelniania, aby zawierało parametr zasobu w celu zdefiniowania docelowych odbiorców tokenu dostępu. Takie mechanizmy pozwalają adpotacjom OAuth na oddzielenie klienta od strony konsumującej token (odbiorców).

Kavindu Dodanduwa
źródło