JWT için en iyi HTTP Yetkilendirme başlık türü


230

JWT belirteçleriAuthorization için en uygun HTTP üstbilgi türünün ne olduğunu merak ediyorum .

Muhtemelen en popüler türlerden biri Basic. Örneğin:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Oturum açma adı ve parola gibi iki parametreyi işler. Bu nedenle JWT jetonları için geçerli değildir.

Ayrıca, Taşıyıcı türünü duydum , örneğin:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

Ancak, anlamını bilmiyorum. Ayılarla mı ilgili?

HTTP Authorizationüstbilgisinde JWT belirteçlerini kullanmanın belirli bir yolu var mı ? Kullanmalı mıyız Bearer, yoksa basitleştirmeli ve kullanmalıyız:

Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

Teşekkürler.

Düzenle:

Veya sadece bir JWTHTTP üstbilgisi:

JWT: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

Yanıtlar:


297

İstemcinizin bir erişim belirteci (JWT veya başka bir belirteç) göndermesi için en iyi HTTP üstbilgisi Authorization, Bearerkimlik doğrulama düzenine sahip üstbilgidir .

Bu şema RFC6750 tarafından açıklanmaktadır .

Misal:

GET /resource HTTP/1.1
Host: server.example.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIXVCJ9TJV...r7E20RMHrHDcEfxjoYZgeFONFh7HgQ

Daha güçlü güvenlik korumasına ihtiyacınız varsa, aşağıdaki IETF taslağını da düşünebilirsiniz: https://tools.ietf.org/html/draft-ietf-oauth-pop-architecture . Bu taslak https://tools.ietf.org/html/draft-ietf-oauth-v2-http-mac için iyi bir alternatif gibi görünüyor .

Bu RFC ve yukarıdaki özellikler OAuth2 Framework protokolü ile ilgili olsa bile, bir istemci ile sunucu arasında belirteç alışverişi gerektiren diğer tüm bağlamlarda kullanılabileceğini unutmayın.

Özel aksine JWTsenin soru söz düzeni, bir IANA'da kayıtlı .Bearer

İlgili Basicve Digestkimlik doğrulama düzenleri, bir kullanıcı adı ve bir sır (bkz kullanarak kimlik doğrulaması için varız RFC7616 ve RFC7617 ) bu bağlamda böylece uygulanamaz.


3
Teşekkür ederim! Bu Beareranahtar kelimenin kökenini görmek güzel . Ama OAuth'dan geliyor. Ancak JWT, OAuth olmadan kullanılabilir. OAuth teknik özelliklerinden tamamen bağımsızdır.
Zag zag ..

2
Evet, OAuth2 çerçeve protokolünden gelir, ancak başka herhangi bir bağlamda kullanılabilir. Sunucunuz JWT'yi diğer üstbilgileri veya yolları (ör. Gövde isteğinde veya sorgu dizesinde) kullanarak kabul edebilir, ancak Authenticateüstbilgi daha uygundur ve HTTP 1.1 bağlamında bir kimlik doğrulama çerçevesini tanımlayan RFC7235 ile uyumludur
Florent Morselli

1
Zag zag ile hemfikirim, "JWT" ​​gibi özel bir plan, OAuth2 Bearer şemasını buna zorlamaktan daha uygun görünüyor.
l8nite

50
Bu kabul edilen cevap olmalı. Alıntı jwt.io/introduction : "kullanıcı aracısı JWT'yi , genellikle Yetkilendirme başlığında, Taşıyıcı şemasını kullanarak göndermelidir. Başlığın içeriği aşağıdaki gibi olmalıdır: Yetkilendirme: Taşıyıcı <token>"
wrschneider

3
Birine yardımcı olursa - buraya bu örneği aramaya geldim: - Taşıyıcı şemasını kullanarak kıvırma isteği:curl -H "Authorization: Bearer <TOKEN>" <the rest of your curl cmd>
Kevin Friedheim

77

Kısa cevap

BearerKimlik doğrulama şeması aradığınız budur.

Uzun cevap

Ayılarla mı ilgili?

Hata ... Hayır :)

Göre Oxford Sözlükler , burada tanımı var taşıyıcısı :

taşıyıcı / ˈbɛːrə /
isim

  1. Bir şey taşıyan veya elinde tutan kişi veya şey.

  2. Para ödemek için çek veya başka bir emir sunan kişi.

İlk tanım şu eşanlamlıları içerir: haberci , ajan , konveyör , elçi , taşıyıcı , sağlayıcı .

Ve işte RFC 6750'ye göre taşıyıcı token tanımı :

1.2. terminoloji

Taşıyıcı Jetonu

Belirteci elinde bulunduran herhangi bir tarafın ("taşıyıcı"), belirteci elinde bulunduran diğer tarafların kullanabileceği herhangi bir şekilde kullanabileceği özelliğe sahip bir güvenlik belirteci. Bir taşıyıcı belirtecinin kullanılması, kriptografik anahtar materyale sahip olduğunu kanıtlamak için bir taşıyıcı gerektirmez (bulundurma kanıtı).

BearerKimlik doğrulama şeması olan IANA'da kayıtlı ve aslen tanımlanan RFC 6750 OAuth 2.0 yetkilendirme çerçevesi için, ama hiçbir şey kullanmanızı durur BearerOAuth 2.0 kullanmayan uygulamalarda erişim simgeleri için şemasını.

Mümkün olduğunca standartlara bağlı kalın ve kendi kimlik doğrulama düzenlerinizi yaratmayın.


Kimlik doğrulama şeması Authorizationkullanılarak istek başlığında bir erişim belirteci gönderilmelidir Bearer:

2.1. Yetkilendirme İsteği Başlık Alanı

AuthorizationHTTP / 1.1 tarafından tanımlanan istek başlığı alanına erişim belirteci gönderirken, istemci Bearererişim belirtecini iletmek için kimlik doğrulama düzenini kullanır .

Örneğin:

GET /resource HTTP/1.1
Host: server.example.com
Authorization: Bearer mF_9.B5f-4.1JqM

[...]

İstemciler Authorization, BearerHTTP yetkilendirme şemasına sahip istek başlığı alanını kullanarak bir taşıyıcı simgesiyle kimlik doğrulamalı istekler YAPMALIDIR . [...]

Geçersiz veya eksik jeton söz konusu olduğunda, Bearerşema WWW-Authenticateyanıt başlığına eklenmelidir :

3. WWW-Kimlik Doğrulaması Yanıt Başlığı Alanı

Korunan kaynak isteği kimlik doğrulama bilgilerini içermiyorsa veya korunan kaynağa erişimi sağlayan bir erişim belirteci içermiyorsa, kaynak sunucusu HTTP WWW-Authenticateyanıt başlığı alanını [...] içermelidir ZORUNLU .

Bu spesifikasyon tarafından tanımlanan tüm zorluklar kimlik doğrulama şeması değerini KULLANMALIDIR Bearer. Bu şemayı bir veya daha fazla auth-param değeri izlemelidir ZORUNLU. [...].

Örneğin, kimlik doğrulaması olmadan korunan bir kaynak isteğine yanıt olarak:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example"

Süresi dolmuş bir erişim belirteci kullanan bir kimlik doğrulama girişimi ile korunan bir kaynak isteğine yanıt olarak:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer realm="example",
                         error="invalid_token",
                         error_description="The access token expired"

5
Evet. Ayılarla ilgilidir. Aynı şekilde python yılanlarla da ilişkilidir. Duh.
Nicholas Hamilton

4
Ayılar .. Öyle. benim günümü yaptığın için teşekkür ederim.
user2501323

Bu bir güvenlik açığı mıdır: kullanıcıya jeton veririm, ancak bana bir istek göndermek istediğinde, jetonu istek gövdesinde geri göndermesi gerekir mi? Sonra oradan alıp doğrulayacağım? Onlar istek göndermek benim tarafımdan tanımlanma şekli gibi ben gerçekten başka seçenekler yok, ama bu herhangi bir kötü olup olmadığını veya daha güvenli hale getirmek için bir çözüm varsa ilgilenirim.
Daniel Jeney
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.