Jak zweryfikować token dostępu OAuth 2.0 dla serwera zasobów?

147

Gdy klient prosi serwer zasobów o uzyskanie chronionego zasobu z tokenem dostępu OAuth 2.0, w jaki sposób ten serwer sprawdza poprawność tokenu? Protokół odświeżania tokena OAuth 2.0?

Potw
źródło
Serwer powinien być w stanie zweryfikować token, który wcześniej wystawił ... Zwykle będzie to wyszukiwanie w bazie danych lub krypto (tokeny z podpisem własnym).
Thilo,
Widzę. A co z tym przypadkiem, gdy właściciel zasobów WS i klient WS są na różnych urządzeniach?
Potwierdzenie
5
Masz na myśli usługę uwierzytelniania i usługę zasobów? (klient / konsument zawsze będzie na innym urządzeniu i nie może sam zweryfikować tokenów) W takim przypadku możesz użyć tokenów odświeżania, które są „drogie” do sprawdzenia (tylko serwer autoryzacji może to zrobić), ale długotrwałe i tokeny dostępu, które często tracą ważność i można je sprawdzić w trybie offline.
Thilo,
blog.facilelogin.com/2016/03/…
Prabath Siriwardena

Odpowiedzi:

97

Aktualizacja listopad 2015: Zgodnie z Hansem Z. poniżej - jest to teraz rzeczywiście zdefiniowane jako część RFC 7662 .

Oryginalna odpowiedź: Specyfikacja OAuth 2.0 ( RFC 6749 ) nie definiuje jasno interakcji między serwerem zasobów (RS) a serwerem autoryzacji (AS) w celu weryfikacji tokenu dostępu (AT). To naprawdę zależy od formatu / strategii tokena AS - niektóre tokeny są niezależne (jak JSON Web Tokens ), podczas gdy inne mogą być podobne do plików cookie sesji, ponieważ odnoszą się tylko do informacji przechowywanych po stronie serwera w AS.

W grupie roboczej OAuth odbyła się dyskusja na temat stworzenia standardowego sposobu komunikacji RS z AS w celu walidacji AT. Moja firma (Ping Identity) ma pochodzić z jednego takiego podejścia do naszej komercyjnej OAuth AS (PingFederate): https://support.pingidentity.com/s/document-item?bundleId=pingfederate-93&topicId=lzn1564003025072.html#lzn1564003025072__section_N10578_N1002A_N10001 . Wykorzystuje do tego interakcję opartą na REST, która jest bardzo komplementarna do OAuth 2.0.

Scott T.
źródło
Scott T, czy istnieje sposób, aby zobaczyć przykładowy kod, jak korzystać z funkcji w Ping Federate?
JavaHead
2
@JavaHead więcej szczegółów dotyczących protokołu znajduje się na naszej stronie dla programistów tutaj: developer.pingidentity.com/en/resources/ ... , PingFederate OAuth Playground jest dostarczany jako zestaw stron JSP, do których można się odwoływać jako kod źródłowy do weryfikacji tokenów. To (i inne biblioteki i próbki open source) można pobrać tutaj: developer.pingidentity.com/en/code.html
Scott T.
Scott, szukam próbki, która zademonstruje Grant poświadczeń klienta z interfejsem Rest API chronionym przez lokalny serwer zasobów i PingFederate jako serwer uwierzytelniania. Lokalny serwer zasobów wywoła wtedy punkt końcowy walidacji. Czy spotkałeś coś takiego?
JavaHead
@JavaHead jeszcze raz, to jest coś, dla czego powinieneś być w stanie odwołać się do PingFederate OAuth Playground. Przedstawia zarówno typ przyznania poświadczeń klienta, jak i weryfikację tokenu dostępu przez serwer zasobów.
Scott T.
W przypadku tokena dostępu JWT zakładam, że zazwyczaj nie chcesz trafiać do punktu końcowego introspekcji AS dla każdego żądania przychodzącego do RS. W takim przypadku czy kontrola RS podpisu tokena i zakresu jest wystarczająca? A może RS mógłby przez jakiś czas buforować odpowiedzi introspekcji z AS?
Gary
119

Sposób Google

Weryfikacja tokena Google Oauth2

Żądanie:

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

Odpowiadać:

{
  "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
} 

Sposób Microsoft

Microsoft - Oauth2 sprawdź autoryzację

Github sposób

Github - Oauth2 sprawdź autoryzację

Żądanie:

GET /applications/:client_id/tokens/:access_token

Odpowiadać:

{
  "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"
  }
}

Sposób Amazon

Logowanie przez Amazon - przewodnik dla programistów (grudzień 2015 r., Strona 21)

Żądanie :

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

Odpowiedź:

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
}
gustavodiazjaimes
źródło
2
@gustavodiazjaimes W ogóle nie wyjaśnia, w jaki sposób strona serwera rozpoznaje przypisany identyfikator użytkownika z tokena.
user2284570
22
Nie rozumiem wszystkich głosów pozytywnych. To nie wydaje się odpowiadać na pytanie.
Duncan Jones,
Czy ktoś wie, czy Azure Active Directory ma podobny punkt końcowy, aby sprawdzić, czy wystawiony token jest prawidłowy?
user180940
2
Innymi słowy, stwórz własną.
AndroidDev
51

Aktualizacja odpowiedzi @Scott T.: interfejs między serwerem zasobów a serwerem autoryzacji do sprawdzania poprawności tokenów został ustandaryzowany w IETF RFC 7662 w październiku 2015, patrz: https://tools.ietf.org/html/rfc7662 . Przykładowe wezwanie do weryfikacji wyglądałoby tak:

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

i przykładowa odpowiedź:

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"
}

Oczywiście przyjęcie przez dostawców i produkty będzie musiało nastąpić z czasem.

Hans Z.
źródło
Jeśli nie korzystasz z OoenId Connect, wolimy otwarty sposób używania tokena id do walidacji tokena dostępu: openid.net/specs/ ...
adnan kamili
1
@Renan: być zgodnym ze sposobem, w jaki zakresy są żądane w żądaniu autoryzacji, które jest z scopeparametrem zapytania, którego wartość zawiera listę zakresów oddzielonych spacjami
Hans Z.
4
Prosimy nie używać słowa „standaryzowany”, jeśli coś nie zostało oficjalnie zaakceptowane przez organ zarządzający. IETF RFC 7662 z lutego 2018 wyraźnie wskazuje, że jest to „propozycja”.
AndroidDev
1
@adnankamili Nie ma czegoś takiego jak „propozycja”. Zanim dokument stanie się RFC, jest już „proponowanym standardem”, który ma za sobą znaczną wagę. Sama OAuth 2.0 jest nadal „proponowanym standardem”, więc nie jestem pewien, do czego zmierzasz.
Tempo
15

Specyfikacja OAuth 2.0 nie definiuje części. Ale może być kilka opcji:

  1. Gdy serwer zasobów otrzyma token w nagłówku Authz, wywołuje API walidacji / introspekcji na serwerze Authz, aby zweryfikować token. Tutaj serwer Authz może zweryfikować to przy użyciu DB Store lub weryfikując podpis i pewne atrybuty. W ramach odpowiedzi dekoduje token i przesyła rzeczywiste dane tokena wraz z pozostałym czasem wygaśnięcia.

  2. Serwer Authz może zaszyfrować / podpisać token przy użyciu klucza prywatnego, a następnie publickey / cert może zostać przekazany serwerowi zasobów. Gdy serwer zasobów otrzymuje token, odszyfrowuje / weryfikuje podpis, aby zweryfikować token. Pobiera zawartość i przetwarza token. Następnie może zapewnić dostęp lub odrzucić.

dvsakgec
źródło
8

Specyfikacje protokołu OAuth v2 wskazują:

Atrybuty tokenu dostępu i metody używane do uzyskiwania dostępu do chronionych zasobów wykraczają poza zakres tej specyfikacji i są zdefiniowane w specyfikacjach towarzyszących.

Mój serwer autoryzacji ma punkt końcowy usługi sieciowej (SOAP), który umożliwia serwerowi zasobów sprawdzenie, czy token_dostępu jest prawidłowy.

Carlos AG
źródło