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?
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.
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.
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?
@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:
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:
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.
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ć.
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.
Odpowiedzi:
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.
źródło
Sposób Google
Weryfikacja tokena Google Oauth2
Żądanie:
Odpowiadać:
Sposób Microsoft
Microsoft - Oauth2 sprawdź autoryzację
Github sposób
Github - Oauth2 sprawdź autoryzację
Żądanie:
Odpowiadać:
Sposób Amazon
Logowanie przez Amazon - przewodnik dla programistów (grudzień 2015 r., Strona 21)
Żądanie :
Odpowiedź:
źródło
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:
i przykładowa odpowiedź:
Oczywiście przyjęcie przez dostawców i produkty będzie musiało nastąpić z czasem.
źródło
scope
parametrem zapytania, którego wartość zawiera listę zakresów oddzielonych spacjamiSpecyfikacja OAuth 2.0 nie definiuje części. Ale może być kilka opcji:
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.
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ć.
źródło
Specyfikacje protokołu OAuth v2 wskazują:
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.
źródło