Bir kaynak sunucu için OAuth 2.0 erişim belirteci nasıl doğrulanır?


147

İstemci bir kaynak sunucudan OAuth 2.0 erişim belirteciyle korunan bir kaynak almasını istediğinde, bu sunucu belirteci nasıl doğrular? OAuth 2.0 yenileme belirteci protokolü?


Sunucunun daha önce kendi verdiği jetonu doğrulayabilmesi gerekiyor ... Genellikle bu bir veritabanı araması veya kripto (kendinden imzalı jetonlar) olacaktır.
Thilo

Anlıyorum. Peki bu durumda, kaynak sahibi WS ve istemci WS fark cihazlarında mı?
Ack

5
Kimlik doğrulama hizmeti ve kaynak hizmeti mi demek istediniz? (istemci / tüketici her zaman farklı bir cihazda olur ve jetonları kendisi doğrulayamaz) Bu durumda, kontrol etmek için "pahalı" olan yenileme jetonlarını kullanabilirsiniz (yalnızca yetkilendirme sunucusu bunu yapabilir), ancak uzun ömürlü ve süresi dolan ve çevrimdışı kontrol edilebilen erişim belirteçleri.
Thilo

Yanıtlar:


97

Güncelleme Kasım 2015: Aşağıdaki Hans Z.'ye göre - bu aslında RFC 7662'nin bir parçası olarak tanımlandı .

Orijinal Yanıt: OAuth 2.0 spec ( RFC 6749 ), erişim belirteci (AT) doğrulaması için Kaynak Sunucu (RS) ile Yetkilendirme Sunucusu (AS) arasındaki etkileşimi açıkça tanımlamaz. Gerçekten AS'nin token biçimine / stratejisine bağlıdır - bazı jetonlar bağımsızdır ( JSON Web Jetonları gibi ), diğerleri ise AS'de sunucu tarafında tutulan bilgilere referans verdikleri için bir oturum çerezine benzeyebilir.

Olmamıştır bazı tartışmalar bir RS AT doğrulama için AS ile iletişim kurmak için standart bir yol oluşturma hakkında OAuth Çalışma Grubu. Şirketim (Ping Kimliği) ticari OAuth AS (PingFederate) için böyle bir yaklaşım ortaya koydu: https://support.pingidentity.com/s/document-item?bundleId=pingfederate-93&topicId=lzn1564003025072.html#lzn1564003025072__section_N10578_N1002A_N10001 . Bunun için OAuth 2.0'ı tamamlayıcı olan REST tabanlı etkileşim kullanır.


Scott T, Ping Federate özelliğinin nasıl kullanılacağına dair bir kod örneği görmenin bir yolu var mı?
JavaHead

2
@JavaHead burada geliştirici web sitemizde ele alınan bazı protokol detayları vardır: geliştirici.pingidentity.com/ tr/resources/…, PingFederate OAuth Oyun Alanı, jetonları doğrulamak için kaynak kodu olarak referans verilebilecek bir JSP kümesi olarak gönderilir. It (ve diğer açık kaynak kütüphaneleri ve örnekleri) buradan indirilebilir: developer.pingidentity.com/en/code.html
Scott T.

Scott, yerel bir Kaynak Sunucu ve Auth Server olarak PingFederate tarafından korunan Rest API ile İstemci Kimlik Bilgileri Hibe gösterecek bir örnek arıyorum. Daha sonra yerel kaynak sunucusu doğrulama bitiş noktasını çağırır. Böyle bir şeyle karşılaştın mı?
JavaHead

@JavaHead yine PingFederate OAuth Oyun Alanı'na başvurabilmeniz gereken bir şey. Hem İstemci Kimlik Bilgileri Verme Türü'nü hem de bir Erişim Sunucusunun Kaynak Sunucu tarafından doğrulanmasını gösterir.
Scott T.

Bir JWT erişim belirteci durumunda, genellikle RS'ye gelen her istek için AS içgözlem uç noktasına vurmak istemeyeceğinizi varsayarım. Hangi durumda, bir RS belirteç imzası ve kapsam kontrolü yeterli midir? Ya da, belki RS, AS'nin içgözlem tepkilerini bir süre için önbelleğe alabilir mi?
Gary

120

Google yolu

Google Oauth2 Jetonu Doğrulaması

İstek:

https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=1/fFBGRNJru1FQd44AzqT3Zg

Cevap vermek:

{
  "audience":"8819981768.apps.googleusercontent.com",
  "user_id":"123456789",
  "scope":"https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email",
  "expires_in":436
} 

Microsoft yolu

Microsoft - Oauth2 yetkilendirmeyi kontrol et

Github yolu

Github - Oauth2 yetkilendirmeyi kontrol et

İstek:

GET /applications/:client_id/tokens/:access_token

Cevap vermek:

{
  "id": 1,
  "url": "https://api.github.com/authorizations/1",
  "scopes": [
    "public_repo"
  ],
  "token": "abc123",
  "app": {
    "url": "http://my-github-app.com",
    "name": "my github app",
    "client_id": "abcde12345fghij67890"
  },
  "note": "optional note",
  "note_url": "http://optional/note/url",
  "updated_at": "2011-09-06T20:39:23Z",
  "created_at": "2011-09-06T17:26:27Z",
  "user": {
    "login": "octocat",
    "id": 1,
    "avatar_url": "https://github.com/images/error/octocat_happy.gif",
    "gravatar_id": "somehexcode",
    "url": "https://api.github.com/users/octocat"
  }
}

Amazon yolu

Amazon ile Giriş - Geliştirici Kılavuzu (Aralık 2015, sayfa 21)

İstek :

https://api.amazon.com/auth/O2/tokeninfo?access_token=Atza|IQEBLjAsAhRmHjNgHpi0U-Dme37rR6CuUpSR...

Tepki :

HTTP/l.l 200 OK
Date: Fri, 3l May 20l3 23:22:l0 GMT 
x-amzn-RequestId: eb5be423-ca48-lle2-84ad-5775f45l4b09 
Content-Type: application/json 
Content-Length: 247 

{ 
  "iss":"https://www.amazon.com", 
  "user_id": "amznl.account.K2LI23KL2LK2", 
  "aud": "amznl.oa2-client.ASFWDFBRN", 
  "app_id": "amznl.application.436457DFHDH", 
  "exp": 3597, 
  "iat": l3ll280970
}

2
@gustavodiazjaimes Sunucu tarafının atanmış kullanıcı kimliğini bir belirteçten nasıl tanıdığı hiç açıklanmaz.
user2284570

22
Bütün oyları anlamıyorum. Bu soruya cevap vermiyor gibi görünüyor.
Duncan Jones

Azure Active Directory'nin verilen bir belirtecin geçerli olup olmadığını denetlemek için benzer bir uç noktası olup olmadığını bilen var mı?
user180940

2
Başka bir deyişle, kendinizinkini yuvarlayın.
AndroidDev

51

@Scott T.'nin cevabı hakkında bir güncelleme: Kaynak Sunucusu ile token doğrulaması için Yetkilendirme Sunucusu arasındaki arayüz Ekim 2015'te IETF RFC 7662'de standartlaştırılmıştır, bkz: https://tools.ietf.org/html/rfc7662 . Örnek bir doğrulama çağrısı şöyle görünecektir:

POST /introspect HTTP/1.1
Host: server.example.com
Accept: application/json
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer 23410913-abewfq.123483

token=2YotnFZFEjr1zCsicMWpAA

ve örnek bir yanıt:

HTTP/1.1 200 OK
Content-Type: application/json

{
  "active": true,
  "client_id": "l238j323ds-23ij4",
  "username": "jdoe",
  "scope": "read write dolphin",
  "sub": "Z5O3upPC88QrAjx00dis",
  "aud": "https://protected.example.net/resource",
  "iss": "https://server.example.com/",
  "exp": 1419356238,
  "iat": 1419350238,
  "extension_field": "twenty-seven"
}

Tabii ki satıcılar ve ürünler tarafından benimsenmesi zaman içinde gerçekleşmelidir.


OoenId Connect kullanıyorsanız, erişim belirtecini doğrulamak için kimlik belirtecini kullanmanın açık yolunu tercih etmemeliyiz: openid.net/specs/…
adnan kamili

1
@Renan: yetkilendirme isteğinde kapsamların talep edilme şekline uygun olması scope; değeri boşlukla ayrılmış kapsam listesi içeren bir sorgu parametresiyle
Hans Z.

4
Resmi bir kurum tarafından resmi olarak kabul edilmediğinde lütfen "standartlaştırılmış" kelimesini kullanmayın. Şubat 2018 itibariyle IETF RFC 7662, bunun bir "teklif" olduğunu açıkça göstermektedir.
AndroidDev

1
@adnankamili "Teklif" diye bir şey yoktur. Bir belge bir RFC olduğunda, zaten arkasında önemli bir ağırlık taşıyan bir "önerilen standart" tır. OAuth 2.0'ın kendisi hala "önerilen bir standart" tır, bu yüzden hangi noktayı ifade etmeye çalıştığınızdan emin değilim.
Pace

15

OAuth 2.0 spec parçayı tanımlamaz. Ancak birkaç seçenek olabilir:

  1. Kaynak sunucu belirteci Authz Üstbilgisinde aldığında, belirteci doğrulamak için Authz sunucusundaki validate / introspect API'sini çağırır. Burada Authz sunucusu DB Mağazası'nı kullanarak veya imzayı ve belirli öznitelikleri doğrulayarak doğrulayabilir. Yanıtın bir parçası olarak, jetonun kodunu çözer ve jetonun gerçek verilerini kalan süre bitimiyle birlikte gönderir.

  2. Authz Server özel anahtarı kullanarak jetonu şifreleyebilir / imzalayabilir ve ardından Kaynak Sunucu'ya publickey / cert verilebilir. Kaynak sunucu belirteci aldığında, belirteci doğrulamak için imzanın şifresini çözer / doğrular. İçeriği çıkarır ve jetonu işler. Daha sonra erişim sağlayabilir veya reddedebilir.


8

OAuth v2 özellikleri şunları gösterir:

Erişim belirteci öznitelikleri ve korunan kaynaklara erişmek için kullanılan yöntemler bu belirtimin kapsamı dışındadır ve tamamlayıcı belirtimlerle tanımlanır.

Yetkilendirme Sunucum, Kaynak Sunucunun access_token değerinin geçerli olup olmadığını bilmesini sağlayan bir web hizmeti (SOAP) uç noktasına sahip.

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.