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_id
wartością nagłówka HTTP. Czy oni są tacy sami? Jeśli nie, czy możesz wyjaśnić różnicę między nimi?
Podejrzewam, że aud
powinno to odnosić się do serwera (ów) zasobów, a client_id
powinno 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.
aud REQUIRED for session_token. Contains the client_id of the client receiving the assertion.
aud
Roszczenie dotyczące JWT (odbiorców)Zgodnie z RFC 7519 :
aud
Oś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 jednoaud
roszczenie. Twórca tokena nie wymusza tego, czyaud
został 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ść
aud
identyfikuje się sam, a token powinien sprawdzać tylko wtedy, gdy zadeklarowany identyfikator odbiorcy to obecny waud
roszczeniu. 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ęaud
za pomocą ciągu znaków:api3.app.com
wówczas powinien akceptować token JWT tylko wtedy, gdyaud
roszczenie zawieraapi3.app.com
listę 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
aud
twierdzenie 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
aud
jest 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 zweryfikujeaud
tokenu, 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
aud
możemy określić żądanierefresh
dla tokenów odświeżania i żądanieaccess
dla 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.aud
Walidacja jak opisano powyżej powie nam, czy token był rzeczywiście ważny token odświeżania patrząc specjalnie na roszczenierefresh
waud
.Identyfikator klienta OAuth a
aud
roszczenie JWTIdentyfikator klienta OAuth jest całkowicie niepowiązany i nie ma bezpośredniego związku z
aud
oś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
aud
roszczeniu JWT .źródło
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
aud
oś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)
Tokeny identyfikacyjne OIDC ##
OIDC oprócz tokenów dostępu posiada również tokeny identyfikacyjne . Specyfikacja OIDC jasno określa użycie
aud
oświadczenia w tokenach identyfikacyjnych. ( openid-connect-core-1.0 )ponadto OIDC określa
azp
oświadczenie, które jest używane w połączeniu z,aud
gdyaud
ma więcej niż jedną wartość.źródło
Chociaż to jest stare, myślę, że pytanie jest aktualne nawet dzisiaj
Tak, audyt powinien odnosić się do strony konsumenta tokenów. A client_id odnosi się do strony otrzymującej token.
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).
źródło