JWT (Json Web Token) Audience "aud" ile Client_Id - Fark nedir?


104

Kimlik doğrulama sunucumda OAuth 2.0 JWT erişim belirtecini uygulamaya çalışıyorum. Ancak, JWT audiddiası ile client_idHTTP başlık değeri arasındaki farkların ne olduğu konusunda net değilim . Bunlar aynı mı? Değilse, ikisi arasındaki farkı açıklayabilir misiniz?

Şüphem, audkaynak sunucularına client_idve kimlik doğrulama sunucusu tarafından tanınan istemci uygulamalarından birine (örn. Web uygulaması veya iOS uygulaması) başvurması gerektiğidir.

Mevcut durumumda, kaynak sunucum aynı zamanda web uygulaması istemcimdir.

Yanıtlar:


134

Görünüşe göre, şüphelerim haklıydı. SeyirciaudBir JWT'deki iddiası, belirteci kabul etmesi gereken Kaynak Sunucularına atıfta bulunmak içindir.

Gibi bu mesaj sadece koyar:

Bir jetonun hedef kitlesi, jetonun hedeflenen alıcısıdır.

Hedef kitle değeri bir dizedir - tipik olarak, erişilen kaynağın temel adresidir, örneğin https://contoso.com.

client_idOAuth'un Kaynak Server kaynaklarını talep edilecektir istemci uygulaması anlamına gelir.

İstemci uygulaması (örn. İOS uygulamanız), Kimlik Doğrulama Sunucunuzdan bir JWT isteyecektir. Bunu yaparken, gerekli olabilecek tüm kullanıcı kimlik bilgileriyle birlikte onu client_idve client_secretbirlikte iletir. Yetkilendirme Sunucusu istemciyi client_idve kullanarak doğrular client_secretve bir JWT döndürür.

JWT, JWT'nin audhangi Kaynak Sunucuları için geçerli olduğunu belirten bir talep içerecektir . Eğeraudwww.myfunwebapp.com istemci uygulaması JWT'yi içeriyorsa , ancak istemci uygulaması JWT'yi kullanmaya çalışırsa www.supersecretwebapp.com, o zaman bu Kaynak Sunucusu JWT'nin kendisi için tasarlanmadığını göreceğinden erişim reddedilecektir.


6
Görünüşe göre aud de client_id olabilir. bakınız 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
Kaynak sunucusu, istemcilerin JWT'yi nereye gönderdiğini bilmez. Kaynak sunucusu iOS uygulamanızdan başka bir URL'ye bu tür trafiği nasıl reddeder? Doğru olduğunu sanmıyorum
John Korsnes

"Aud", "www.webapp.com" içeriyorsa, ancak istemci uygulaması JWT'yi "secret.webapp.com" "da kullanmaya çalışırsa
catamphetamine

2
RFC, hedef kitlenin (aud) alıcıları tanımladığını söylüyor. Alıcılar JWT jetonlarınızı alır. Bir web uygulamanız varsa, bu muhtemelen contoso.com olabilir, ancak bazı masaüstü veya mobil uygulamanız varsa (kimlik doğrulayan) hedef kitlenin herhangi bir URI'si yoktur. İhraççı, JWT belirteçlerini üreten kişidir, bu nedenle büyük olasılıkla sunucunun adresidir. RFC, bu iddianın kullanılmasının İSTEĞE BAĞLI olduğunu söyler, bu nedenle yalnızca ihtiyacınız olduğunda kullanın.
Konrad

1
Aslında izleyici ile yayıncı arasındaki farkın ne olacağı konusunda kafam karıştı.
Andy

65

JWT aud(Kitle) İddiası

RFC 7519'a göre :

"Aud" (izleyici) iddiası, JWT'nin amaçladığı alıcıları tanımlar. JWT'yi işlemeyi amaçlayan her bir ilke, kendisini hedef kitle iddiasında bir değerle özdeşleştirmelidir. Talebi işleyen sorumlu, bu talep mevcut olduğunda "aud" talebindeki bir değerle kendini tanımlamazsa, JWT'nin reddedilmesi ZORUNLUDUR. Genel durumda, "aud" değeri, her biri bir StringOrURI değeri içeren büyük / küçük harf duyarlı dizelerden oluşan bir dizidir. JWT'nin bir kitleye sahip olduğu özel durumda, "aud" değeri, StringOrURI değeri içeren tek bir büyük / küçük harfe duyarlı dize OLABİLİR. Hedef kitle değerlerinin yorumlanması genellikle uygulamaya özeldir. Bu iddianın kullanımı İSTEĞE BAĞLIDIR.

audSpesifikasyon tarafından tanımlandığı şekliyle Audience ( ) talebi geneldir ve uygulamaya özeldir. Amaçlanan kullanım, belirtecin hedeflenen alıcılarını belirlemektir. Alıcının anlamı uygulamaya özeldir. Bir kitle değeri, dizelerden oluşan bir listedir veya yalnızca bir audiddia varsa tek bir dize olabilir . Jetonun yaratıcısı bunu zorlamazaud doğru şekilde onaylamaz, jetonun kullanılması gerekip gerekmediğini belirleme sorumluluğu alıcının sorumluluğundadır.

Değer ne olursa olsun, bir alıcı JWT'yi doğrularken ve belirtecin kendi amaçları için kullanılmasının amaçlandığını doğrulamak istediğinde, içinde hangi değerin audkendisini tanımladığını belirlemesi ZORUNLUdur ve belirteç yalnızca alıcının beyan edilen kimliği ise doğrulamalıdır. audiddiada mevcut . Bunun bir URL mi yoksa uygulamaya özgü başka bir dize mi olduğu önemli değildir. Örneğin, sistemim kendisini auddizeyle tanımlamaya karar verirse : api3.app.como zaman JWT'yi yalnızca audiddia şunları içeriyorsa kabul etmelidir :api3.app.com kitle değerleri listesinde yer .

Elbette alıcılar dikkate almamayı seçebilir aud , bu nedenle bu yalnızca bir alıcı belirtecin kendisi için özel olarak oluşturulduğuna dair pozitif doğrulama isterse yararlı olur.

Spesifikasyona dayalı yorumum şudur: aud yorumum, iddianın yalnızca belirli amaçlar için geçerli olan amaca yönelik oluşturulmuş JWT'ler oluşturmak için yararlı olduğu yönündedir. Bir sistem için bu, bir belirtecin bazı özellikler için geçerli, ancak diğerleri için geçerli olmamasını istediğiniz anlamına gelebilir. Aynı anahtarları ve doğrulama algoritmasını kullanırken, yalnızca belirli bir "hedef kitle" ile sınırlı olan jetonlar düzenleyebilirsiniz.

Tipik bir durumda bir JWT güvenilir bir hizmet tarafından oluşturulduğundan ve diğer güvenilir sistemler (geçersiz belirteçleri kullanmak istemeyen sistemler) tarafından kullanıldığından, bu sistemlerin yalnızca kullanacakları değerleri koordine etmesi gerekir.

Tabii ki, audtamamen isteğe bağlıdır ve kullanım durumunuz bunu garanti etmezse göz ardı edilebilir. Belirteçleri belirli kitleler tarafından kullanılmak üzere sınırlamak istemiyorsanız veya sistemlerinizden hiçbiri audbelirteci gerçekten doğrulamıyorsa , o zaman işe yaramaz.

Örnek: Erişim ve Yenileme Jetonları

Düşünebildiğim uydurulmuş (ancak basit) bir örnek, belki de JWT'leri, ayrı şifreleme anahtarları ve algoritmaları uygulamak zorunda kalmadan jetonlara erişmek ve yenilemek için kullanmak istiyoruz, ancak erişim jetonlarının yenileme jetonları veya kötü niyetli olarak doğrulanmayacağından emin olmak istiyoruz. -versa.

Kullanarak audbiz bir iddiayı belirtebilirsiniz refreshyenileme simgeleri için ve talebini accessbu belirteçleri oluşturma üzerine erişim simgeleri için. Yenileme belirtecinden yeni bir erişim belirteci almak için istekte bulunulduğunda, yenileme belirtecinin gerçek bir yenileme belirteci olduğunu doğrulamamız gerekir. audBelirteç aslında bir istem için özel bakarak belirteci geçerli bir yenileme olup olmadığı yukarıda açıklandığı gibi doğrulama bize söyleyecek refreshiçinde aud.

OAuth İstemci Kimliği ve JWT audHak Talebi

OAuth İstemci Kimliği tamamen ilgisizdir ve JWT audiddialarıyla doğrudan bir ilişkisi yoktur . OAuth perspektifinden bakıldığında, belirteçler opak nesnelerdir.

Bu jetonları kabul eden uygulama, bu jetonların anlamının ayrıştırılmasından ve doğrulanmasından sorumludur. Bir JWT audtalebinde OAuth İstemci Kimliğini belirtmenin pek bir değeri görmüyorum .


3
Genel olarak "kendini tanımlamalı" konusunda biraz bulanıkım. RFC7519, bunun gibi açıklanamayan bitlerle ve diğer kimlik doğrulama sistemlerine belirsiz imalarla doludur; bu, muhtemelen standart talep alanlarının doğru yorumlanmasının bulunduğu yerdir. Açıkçası RFC, ne kadar yararlı olursa olsun, böyle bir durumda asla taslak aşamasından çıkmamalıydı.
Chuck Adams

1
@ChuckAdams Düşüncelerimi netleştirmek için düzenledim. RFC'nin özellikle "standart iddialar" ve bunların nasıl / ne zaman kullanılacağı konusunda çok belirsiz olduğuna katılıyorum.
Kekoa

2
Şu anda aud-alanının nasıl kullanılacağına dair aynı tartışmayı yapıyoruz ve bunun alıcıyı (belirteci onaylayan ve kabul eden kişi) içermesi gerektiğini kabul ediyorum, client_id (jetonun üzerinde işlem yapmasını isteyen kişi) kullanıcı adına).
hardysim

4

Buraya OpenID Connect (OIDC) aramaya geldiyseniz: OAuth 2.0! = OIDC

Bunun oauth 2.0 için etiketlendiğini ve OIDC DEĞİL olduğunu anlıyorum, ancak her iki standart da JWT'leri ve audiddiayı kullanabildiğinden , 2 standart arasında sık sık bir karıştırma vardır . Ve biri (OIDC) temelde diğerinin bir uzantısıdır (OAUTH 2.0). (OIDC'yi kendim ararken bu soruya rastladım.)

OAuth 2.0 Erişim Belirteçleri ##

OAuth 2.0 Erişim belirteçleri için , mevcut yanıtlar bunu oldukça iyi kapsıyor. Ek olarak burada OAuth 2.0 Çerçevesinden (RFC 6749) ilgili bir bölüm var

Örtülü akışları kullanan genel istemciler için bu belirtim, istemcinin hangi istemciye bir erişim belirtecinin verildiğini belirlemesi için herhangi bir yöntem sağlamaz.
...
Kaynak sahiplerinin istemcilere kimlik doğrulaması bu belirtimin kapsamı dışındadır. Yetkilendirme sürecini istemciye delege edilmiş son kullanıcı kimlik doğrulaması biçimi olarak kullanan herhangi bir belirtim (ör. Üçüncü taraf oturum açma hizmeti), istemcinin erişimin jeton, kullanımı için verildi (örneğin, erişim jetonunu izleyici ile kısıtlama).

OIDC ID Jetonları ##

OIDC, Erişim belirteçlerine ek olarak Kimlik Belirteçlerine sahiptir. OIDC spesifikasyonu, audtalebin Kimlik Jetonlarında kullanımı konusunda açık bir şekilde belirtilmiştir . ( openid-connect-core-1.0 )

aud
GEREKLİDİR. Bu Kimlik Simgesinin amaçlandığı kitle (ler). İzleyici değeri olarak Bağlı Tarafın OAuth 2.0 client_id'sini İÇERMELİDİR. Ayrıca diğer kitleler için tanımlayıcılar İÇEREBİLİR. Genel durumda, aud değeri, büyük / küçük harfe duyarlı dizelerden oluşan bir dizidir. Tek bir kitle olduğunda yaygın özel durumda, aud değeri tek bir büyük / küçük harfe duyarlı dize OLABİLİR.

ayrıca OIDC , birden fazla değere azpsahip audolduğunda bağlantılı olarak kullanılan iddiayı belirtir aud.

azp
İSTEĞE BAĞLI. Yetkili taraf - Kimlik Simgesinin verildiği taraf. Varsa, bu tarafın OAuth 2.0 İstemci Kimliğini İÇERMELİDİR. Bu İddia yalnızca Kimlik Simgesinin tek bir kitle değerine sahip olması ve bu hedef kitlenin yetkili taraftan farklı olması durumunda gereklidir. Yetkili taraf tek hedef kitle ile aynı olsa bile dahil edilebilir. Azp değeri, StringOrURI değeri içeren büyük / küçük harfe duyarlı bir dizedir.


1
Bir şeyi not etmek gerekirse: Oauth2, JWT kullanımını zorlamaz.
zoran

1

Bu eski olmasına rağmen soru bugün bile geçerli diye düşünüyorum

Şüphem, aud'ın kaynak sunucularına ve client_id'nin kimlik doğrulama sunucusu tarafından tanınan istemci uygulamalarından birine başvurması gerektiğidir.

Evet, aud , token tüketen tarafa atıfta bulunmalıdır. Ve client_id parti elde belirteç belirtmektedir.

Mevcut durumumda, kaynak sunucum aynı zamanda web uygulaması istemcimdir.

OP'nin senaryosunda, web uygulaması ve kaynak sunucusu aynı tarafa aittir. Yani bu, müşteri ve izleyicinin aynı olması anlamına gelir. Ancak durumun böyle olmadığı durumlar olabilir.

OAuth korumalı bir kaynağı kullanan bir SPA düşünün. Bu senaryoda SPA istemcidir. Korumalı kaynak, erişim belirtecinin izleyicisidir.

Bu ikinci senaryo ilginç. Yerinde "adında bir çalışma taslağı varYetkilendirme isteğinizde hedef kitleyi nerede tanımlayabileceğinizi açıklayan " OAuth 2.0 için Kaynak Göstergeleri . Böylece ortaya çıkan jeton, belirtilen hedef kitle ile sınırlı olacaktır. Ayrıca Azure OIDC, kaynak kaydına izin verdiği ve erişim belirtecinin amaçlanan hedef kitlesini tanımlamak için kaynak parametresini içermesine izin verdiği benzer bir yaklaşım kullanır. Bu tür mekanizmalar, OAuth reklam noktalarının müşteri ve jeton tüketen (izleyici) taraf arasında bir ayrıma sahip olmasına izin verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.