OAuth 2.0 Taşıyıcı Jetonu tam olarak nedir?


171

Göre RFC6750 Taşıyıcı Jetonu Kullanımı, token taşıyıcısı: -The OAuth 2.0 Yetkilendirme Çerçevesi:

Belirteci elinde bulunduran herhangi bir tarafın ("taşıyıcı"), belirteci elinde bulunduran herhangi bir tarafın kullanabileceği şekilde belirteci kullanabileceği bir güvenlik belirteci.

Bana göre bu tanım belirsiz ve herhangi bir şartname bulamıyorum.

  • Bir yetkilendirme sağlayıcısı uyguladığımı varsayalım, taşıyıcı simgesi için herhangi bir dize sağlayabilir miyim?
  • Rastgele bir dize olabilir mi?
  • Bazı niteliklerin base64 kodlaması mı olmalı?
    Karma mı olmalı?
  • Servis sağlayıcının bu belirteci doğrulamak için yetkilendirme sağlayıcısını sorgulaması gerekiyor mu?

İşaretçi için teşekkürler.


Bir yetkilendirme sağlayıcısı uyguladığımı varsayalım, taşıyıcı simgesi için herhangi bir dize sağlayabilir miyim? Rastgele bir dize olabilir mi? Erişim Jetonları Auth0'ın OAuth 2.0 uç noktaları üzerinden verilir: / authorize ve / oauth / token. Erişim Belirteçleri almak için OAuth 2.0 uyumlu herhangi bir kitaplığı kullanabilirsiniz. Önceden tercih edilen bir OAuth 2.0 kitaplığınız yoksa, Auth0 birçok dil ve çerçeve için kitaplık sağlar.
Bharathkumar V

Yanıtlar:


146

Taşıyıcı Simgesi Belirteci
elinde bulunduran herhangi bir tarafın (bir "taşıyıcı") belirteci, sahip olduğu herhangi bir tarafı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ı).

Taşıyıcı Jetonu, Kimlik Doğrulama sunucusu tarafından sizin için oluşturulur. Bir kullanıcı uygulamanızın (istemcinizin) kimliğini doğruladığında, kimlik doğrulama sunucusu gidip sizin için bir Jeton oluşturur. Taşıyıcı Jetonları, OAuth 2.0 ile kullanılan baskın erişim anahtarıdır. Bir Taşıyıcı belirteci temelde "Taşıyıcıya bu erişime izin ver" der.

Taşıyıcı Jetonu normalde kimlik doğrulama sunucusu tarafından oluşturulan bir çeşit opak değerdir. Rastgele değil; size erişim izni veren kullanıcıya ve uygulamanıza erişim sağladığına göre oluşturulur.

Örneğin, bir API'ye erişmek için bir Erişim Simgesi kullanmanız gerekir. Erişim belirteçleri kısa ömürlüdür (yaklaşık bir saat). Yeni bir Erişim belirteci almak için taşıyıcı belirtecini kullanırsınız. Bir erişim belirteci almak için, Kimlik Doğrulama sunucusuna bu kimlik belirtecini istemci kimliğinizle birlikte gönderirsiniz. Bu şekilde sunucu, taşıyıcı belirtecini kullanan uygulamanın, taşıyıcı belirtecinin oluşturulduğu uygulama olduğunu bilir. Örnek: Sadece uygulamanız için oluşturulmuş bir taşıyıcı jetonu alamıyorum ve uygulamamla birlikte kullanamıyorum, çünkü benim için üretilmedi.

Google Yenileme belirteci şuna benzer: 1 / mZ1edKKACtPAb7zGlwSzvs72PvhAbGmB8K1ZrGxpcNM

Yorumdan kopyalandı: Verdiğiniz taşıyıcı jetonlarında herhangi bir kısıtlama olduğunu düşünmüyorum. Aklıma gelen tek şey, birden fazla izin güzel olmasıdır. Örneğin, bir kullanıcı uygulamayı 30 defaya kadar doğrulayabilir ve eski taşıyıcı jetonları çalışmaya devam eder. oh ve 6 aydır kullanılmazsa, sisteminizden kaldıracağım. Onları oluşturmak ve doğrulamak zorunda olacak kimlik doğrulama sunucunuz bu şekilde biçimlendirilir.

Güncelleme:

Her Satır İçi İşlem HTTP İsteğinin Yetkilendirme başlığında bir Taşıyıcı Jetonu ayarlanır. Örneğin:

POST /rsvp?eventId=123 HTTP/1.1
Host: events-organizer.com
Authorization: Bearer AbCdEf123456
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/1.0 (KHTML, like Gecko; Gmail Actions)

rsvpStatus=YES

"AbCdEf123456"Yukarıdaki örnekte yer alan dize , taşıyıcı yetkilendirme belirtecidir. Bu, kimlik doğrulama sunucusu tarafından üretilen bir şifreleme belirtecidir. İşlemlerle gönderilen tüm taşıyıcı belirteçlerinin sorun alanı vardır; kitle alanı gönderen alanını https: // biçiminde bir URL olarak belirtir. Örneğin, e-posta noreply@example.com adresinden geliyorsa, kitle https://example.com olur .

Taşıyıcı belirteçleri kullanılıyorsa, isteğin kimlik doğrulama sunucusundan geldiğini ve gönderen etki alanına yönelik olduğunu doğrulayın. Simge doğrulamazsa, hizmet isteğe bir HTTP yanıt kodu 401 (Yetkisiz) ile yanıt vermelidir.

Taşıyıcı Jetonları OAuth V2 standardının bir parçasıdır ve birçok API tarafından yaygın olarak benimsenmiştir.


2
@ Xavier Egea Bearer jetonu temel olarak yenileme jetonunuzdur, erişim jetonudur.
Akhil Nambiar

13
Taşıyıcı belirteci, onun bir yenileme belirteci anlamına gelmez @AqeelSmith tools.ietf.org/html/rfc6750#section-6.1.1
Suman Kundu

9
İlk paragraf bir Taşıyıcı belirtecinin bir erişim belirteci değil bir yenileme belirteci olduğunu gösterir. Olay bu değil. Taşıyıcı belirtecinden "Bu özellik, OAuth erişim belirteci bir taşıyıcı belirteci olduğunda korumalı kaynak isteklerinin nasıl yapılacağını açıklar." RFC6750
Daniel

8
Cevabı okuduktan sonra, Bearer token ve yenileme tokenlerinin aynı olduğunu düşündüm. Cevabı açıklığa kavuşturmak için güncellenmelidir.
KurioZ7

2
Bu cevap çok yanıltıcı. Taşıyıcı belirteçleri, bu yanıtın ilk ifadesi olarak Yenile Belirteci DEĞİLDİR. Lütfen düzeltin.
think01

67

Sorunuzu okuduğumda, internette Bearer tokenlerinin nasıl şifrelenmiş veya imzalanmış olduğunu araştırmayı denedim. Taşıyıcı belirteçleri (belki kısmen, ama tamamen değil) karma değildir sanırım çünkü bu durumda, şifresini çözmek ve ondan kullanıcıların özelliklerini almak mümkün olmayacaktır.

Ancak sorunuz, Bearer token işlevselliği hakkında cevaplar bulmaya çalışıyor gibi görünüyor:

Bir yetkilendirme sağlayıcısı uyguladığımı varsayalım, taşıyıcı simgesi için herhangi bir dize sağlayabilir miyim? Rastgele bir dize olabilir mi? Bazı niteliklerin base64 kodlaması olmalı mı? Karma mı olmalı?

Bu yüzden, Taşıyıcı belirteçleri ve Yenileme belirteçlerinin nasıl çalıştığını açıklamaya çalışacağım:

Kullanıcı sunucudan SSL aracılığıyla kullanıcı ve parola gönderen bir belirteç istediğinde, sunucu iki şey döndürür: Erişim belirteci ve Yenileme belirteci .

Erişim belirteci, somut kullanıcı olarak kimlik doğrulaması için tüm istek başlıklarına eklemeniz gereken bir Taşıyıcı belirtecidir.

Authorization: Bearer <access_token>

Erişim belirteci, istediğiniz tüm Kullanıcı özelliklerine, Hak Taleplerine ve Rollerine sahip şifreli bir dizedir. (Daha fazla rol veya hak talebi eklerseniz token boyutunun arttığını kontrol edebilirsiniz). Kaynak Sunucu bir erişim belirteci aldığında, şifresini çözebilir ve bu kullanıcı özelliklerini okuyabilir. Bu şekilde, kullanıcı tüm uygulama ile birlikte onaylanacak ve verilecektir.

Erişim belirteçlerinin süresi kısa (ör. 30 dakika). Erişim belirteçlerinin uzun bir süre dolması olsaydı, bu bir sorun olurdu, çünkü teorik olarak onu iptal etme olanağı yoktur. Bu yüzden "Kullanıcı" olarak değiştirilen role = "Yönetici" olan bir kullanıcı düşünün. Bir kullanıcı eski simgeyi role = "Admin" ile tutarsa, jeton sona erene kadar Yönetici haklarıyla erişebilir. Bu nedenle erişim belirteçlerinin süresi kısa.

Ancak akılda bir konu var. Bir erişim belirtecinin süresinin kısa olması durumunda, her kısa dönemde kullanıcı ve şifreyi göndermemiz gerekir. Bu güvenli mi? Hayır, değil. Bundan kaçınmalıyız. İşte o zaman Yenile tokenleri bu sorunu çözüyor.

Yenileme simgeleri DB'de depolanır ve süresinin dolması uzun olur (örnek: 1 ay).

Bir kullanıcı, ilk belirteç isteğinde aldığı bir yenileme belirteci kullanarak (örneğin her 30 dakikada bir sona erdiğinde) yeni bir Erişim belirteci alabilir. Bir erişim belirtecinin süresi dolduğunda, istemci bir yenileme belirteci göndermelidir. DB'de bu yenileme belirteci varsa, sunucu istemciye yeni bir erişim belirteci ve başka bir yenileme belirteci döndürür (ve eski yenileme belirtecini yenisiyle değiştirir).

Bir kullanıcı Erişim belirtecinin güvenliği ihlal edilmişse, söz konusu kullanıcının yenileme belirtecinin DB'den silinmesi gerekir. Bu şekilde jeton yalnızca erişim jetonu sona erene kadar geçerli olacaktır, çünkü bilgisayar korsanı yenileme jetonunu gönderen yeni bir erişim jetonu almaya çalıştığında bu eylem reddedilir.


2
Bu bölümü anlamıyorum: "Yetkilendirme Sunucusu bir erişim belirteci aldığında, şifresini çözebilecek ve bu kullanıcı özelliklerini okuyabilecektir. Bu şekilde, kullanıcı tüm uygulama boyunca doğrulanacak ve verilecektir". Yetkilendirme sunucusu erişim jetonu veren, almayan sunucu değil mi? Bu konuda kafamı almaya çalışıyorum ve birçok örnek Yetkilendirme sunucusu ve Kaynak sunucu arasında açık bir ayrım yapar. Ne anladım Yetkilendirme sunucusundan Access belirteci almak ve sonra kaynak sunucuya yaptığınız her istek ile birlikte iletmek olduğunu?
kivikall

1
@kivikall Haklısın. Cevapta değiştirdim. Kaynak Sunucu her istekte belirteci (Yetkilendirme Sunucusu'nun belirteç oluşturma işleminde şifrelediği belirteç) alır ve şifresini çözer.
Xavier Egea

1
@kivikall Aslında, bir simgenin şifresini çözmek yetkiyle ilgili bir şey olmalı, bu yüzden Yetkilendirme Sunucusuna ait olmalıdır. Bu yüzden cevaba yazdı. Ancak uygulamada bu, her istekte, alınan Simgeyi Yetkilendirme Sunucusu ile doğrulamanız gerektiği anlamına gelir (belki başka bir istek gerçekleştirebilir). Bu nedenle, performans kaybını önlemek için, belirtecin Kaynak Sunucusuna şifresini çözmek için bazı işlevler vermek daha iyidir. Sonraki bağlantıya bakın: stackoverflow.com/questions/12296017/…
Xavier Egea

Ancak her istekte Kaynak Sunucu, sağlanan AccessToken'in Yetkilendirme Sunucusu için geçerli olup olmadığını kontrol etmelidir. Bir rol değişirse değişiklik Auth Server tarafından hemen yansıtılabilir, değil mi? Ayrıca, AccessToken'ın güvenliği ihlal edilmişse RefreshToken'i neden sileriz? RefreshToken, AccessToken temel alınarak hesaplanamaz, dolayısıyla süresi dolduğunda bilgisayar korsanı yeniden engellenir.
mandarin

Dediğim gibi, erişim belirteci rol gibi kullanıcı bilgilerini içerir. Bir kullanıcı rolü değişirse, geçerli belirtecin süresi dolduğunda bu değişiklik bir sonraki belirteçte yansıtılır. Bu, kısa bir süre içinde (erişim belirtecinin süresinin sona ermesine kadar) kullanıcının aynı rolü koruyacağı ve belirteç hala geçerli olduğu için Auth Server'ın buna izin vereceği anlamına gelir. İkinci soru ile ilgili olarak, Yenile Simgesini silmek kullanıcının kimlik bilgilerini tekrar eklemesini sağlar. Bir erişim belirteci bir araya getirilmişse istediğimiz budur. Diğer durumda, bir bilgisayar korsanı, yenileme süresi sona erene kadar yetkilendirilebilir (örneğin 1 ay boyunca)
Xavier Egea

9

Taşıyıcı belirteci, alfabe, basamak, "-", "bir veya daha fazla tekrarıdır. , "_", "~", "+", "/" ve ardından 0 veya daha fazla "=".

RFC 6750 2.1. Yetkilendirme İsteği Başlık Alanı (Biçim ABNF'dir (Artırılmış BNF))

The syntax for Bearer credentials is as follows:

     b64token    = 1*( ALPHA / DIGIT /
                       "-" / "." / "_" / "~" / "+" / "/" ) *"="
     credentials = "Bearer" 1*SP b64token

Base64'e benziyor, ancak başlıktaki jeton base64 kodlu olmalı mı? , o değil.

"HTTP / 1.1, bölüm 7: Kimlik Doğrulama" ** için biraz daha derin kazmak, ancak b64token sadece base64, base64url, vb kullanılan karakterler için izin veren bir ABNF sözdizimi tanımı olduğunu görüyorum. herhangi bir kodlama veya kod çözme tanımlamak yerine, Yetkilendirme başlığının erişim belirtecini içerecek bölümünde hangi karakterlerin kullanılabileceğini tanımlar.

Referanslar


Taşıyıcı simgelerinin amacını hiç açıklamıyorsunuz.
Jaime Hablutzel
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.