Wie validiere ich ein OAuth 2.0-Zugriffstoken für einen Ressourcenserver?

147

Wie überprüft dieser Server das Token, wenn ein Client einen Ressourcenserver auffordert, eine geschützte Ressource mit einem OAuth 2.0-Zugriffstoken abzurufen? Das OAuth 2.0-Aktualisierungstokenprotokoll?

Bestätigen
quelle
Der Server soll in der Lage sein, das zuvor selbst ausgegebene Token zu validieren. In der Regel handelt es sich dabei um eine Datenbanksuche oder eine Krypto (selbstsignierte Token).
Thilo
Aha. Wie wäre es in diesem Fall, wenn sich der Ressourcenbesitzer WS und der Client WS auf unterschiedlichen Geräten befinden?
Ack
5
Sie meinen den Authentifizierungsdienst und den Ressourcendienst? (Der Client / Consumer befindet sich immer auf einem anderen Gerät und kann Token nicht selbst validieren.) In diesem Fall können Sie Aktualisierungstoken verwenden, deren Überprüfung "teuer" ist (nur der Authentifizierungsserver kann dies tun), aber langlebig und Zugriffstoken, die häufig ablaufen und offline überprüft werden können.
Thilo
blog.facilelogin.com/2016/03/…
Prabath Siriwardena

Antworten:

97

Update Nov. 2015: Gemäß Hans Z. unten - dies ist nun tatsächlich als Teil von RFC 7662 definiert .

Ursprüngliche Antwort: Die OAuth 2.0-Spezifikation ( RFC 6749 ) definiert die Interaktion zwischen einem Ressourcenserver (RS) und einem Autorisierungsserver (AS) für die Validierung des Zugriffstokens (AT) nicht klar. Dies hängt wirklich vom Token-Format / der Token-Strategie des AS ab. Einige Token sind in sich geschlossen (wie JSON-Web-Token ), während andere einem Sitzungscookie ähneln können, da sie nur auf Informationen verweisen, die serverseitig auf dem AS gespeichert sind .

In der OAuth-Arbeitsgruppe gab es einige Diskussionen über die Schaffung einer Standardmethode für die Kommunikation eines RS mit dem AS zur AT-Validierung. Mein Unternehmen (Ping Identity) hat einen solchen Ansatz für unseren kommerziellen OAuth AS (PingFederate) entwickelt: https://support.pingidentity.com/s/document-item?bundleId=pingfederate-93&topicId=lzn1564003025072.html#lzn156400302501_N . Hierfür wird eine REST-basierte Interaktion verwendet, die OAuth 2.0 sehr ergänzt.

Scott T.
quelle
Scott T, Gibt es eine Möglichkeit, ein Codebeispiel zur Verwendung der Funktion in Ping Federate anzuzeigen?
JavaHead
2
@JavaHead Auf unserer Entwickler-Website finden Sie weitere Protokolldetails: developer.pingidentity.com/en/resources/… , der PingFederate OAuth Playground wird als eine Reihe von JSPs ausgeliefert, auf die als Quellcode für die Validierung von Token verwiesen werden kann. Es (und andere Open Source-Bibliotheken und Beispiele) können hier heruntergeladen werden: developer.pingidentity.com/de/code.html
Scott T.
Scott, ich suche nach einem Beispiel, das die Gewährung von Clientanmeldeinformationen mit Rest-API demonstriert, die durch einen lokalen Ressourcenserver und PingFederate als Auth-Server geschützt ist. Der lokale Ressourcenserver ruft dann den Validierungsendpunkt auf. Sind Sie auf so etwas gestoßen?
JavaHead
@JavaHead wieder, das ist etwas, für das Sie auf den PingFederate OAuth-Spielplatz verweisen können sollten. Es zeigt sowohl den Client Credentials Grant-Typ als auch die Validierung eines Zugriffstokens durch einen Ressourcenserver.
Scott T.
Im Fall eines JWT-Zugriffstokens würde ich davon ausgehen, dass Sie normalerweise nicht bei jeder eingehenden Anforderung an den RS den AS-Introspektionsendpunkt erreichen möchten. In welchem ​​Fall reicht eine RS-Überprüfung der Tokensignatur und des Gültigkeitsbereichs aus? Oder könnte der RS ​​die Introspektionsantworten des AS für einige Zeit zwischenspeichern?
Gary
119

Google Weg

Google Oauth2-Token-Validierung

Anfrage:

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

Reagieren:

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

Microsoft - Oauth2 prüft eine Autorisierung

Github Weg

Github - Oauth2 prüft eine Autorisierung

Anfrage:

GET /applications/:client_id/tokens/:access_token

Reagieren:

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

Mit Amazon anmelden - Entwicklerhandbuch (Dez. 2015, Seite 21)

Anfrage :

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

Antwort :

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
quelle
2
@gustavodiazjaimes Es wird überhaupt nicht erklärt, wie die Serverseite die zugewiesene Benutzer-ID anhand eines Tokens erkennt.
user2284570
22
Ich verstehe nicht alle Stimmen. Dies scheint die Frage nicht zu beantworten.
Duncan Jones
Weiß jemand, ob Azure Active Directory über einen ähnlichen Endpunkt verfügt, um zu überprüfen, ob ein ausgestelltes Token gültig ist?
user180940
2
Mit anderen Worten, rollen Sie Ihre eigenen.
AndroidDev
51

Ein Update zur Antwort von @Scott T.: Die Schnittstelle zwischen Resource Server und Authorization Server für die Token-Validierung wurde im Oktober 2015 in IETF RFC 7662 standardisiert, siehe: https://tools.ietf.org/html/rfc7662 . Ein Beispiel für einen Validierungsaufruf würde folgendermaßen aussehen:

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

und eine Beispielantwort:

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

Natürlich muss die Übernahme durch Anbieter und Produkte im Laufe der Zeit erfolgen.

Hans Z.
quelle
Wenn Sie OoenId Connect verwenden, sollten wir nicht die offene Methode zur Verwendung des ID-Tokens zur Validierung des Zugriffstokens bevorzugen: openid.net/specs/…
adnan kamili
1
@ Renan: um mit der Art und Weise übereinzustimmen, wie Bereiche in einer Autorisierungsanforderung angefordert werden, die einen scopeAbfrageparameter enthält, dessen Wert eine durch Leerzeichen getrennte Liste von Bereichen enthält
Hans Z.
4
Bitte verwenden Sie das Wort "standardisiert" nicht, wenn etwas von einem Leitungsgremium nicht offiziell akzeptiert wurde. Der IETF RFC 7662 vom Februar 2018 zeigt deutlich, dass es sich um einen "Vorschlag" handelt.
AndroidDev
1
@adnankamili Es gibt keinen "Vorschlag". Wenn ein Dokument zu einem RFC wird, ist es bereits ein "vorgeschlagener Standard", der ein erhebliches Gewicht hat. OAuth 2.0 selbst ist immer noch ein "vorgeschlagener Standard", daher bin ich mir nicht sicher, welchen Punkt Sie anstreben.
Tempo
15

Die OAuth 2.0-Spezifikation definiert das Teil nicht. Es kann jedoch mehrere Optionen geben:

  1. Wenn der Ressourcenserver das Token im Authz-Header erhält, ruft er die Validate / Introspect-API auf dem Authz-Server auf, um das Token zu validieren. Hier kann der Authz-Server die Validierung entweder anhand des DB Store oder anhand der Signatur und bestimmter Attribute überprüfen. Als Teil der Antwort dekodiert es das Token und sendet die tatsächlichen Daten des Tokens zusammen mit der verbleibenden Ablaufzeit.

  2. Authz Server kann das Token mit einem privaten Schlüssel verschlüsseln / signieren, und dann kann publickey / cert an Resource Server übergeben werden. Wenn der Ressourcenserver das Token erhält, entschlüsselt / überprüft er die Signatur, um das Token zu überprüfen. Nimmt den Inhalt heraus und verarbeitet das Token. Es kann dann entweder Zugriff gewähren oder ablehnen.

dvsakgec
quelle
8

OAuth v2-Spezifikationen geben Folgendes an:

Zugriffstokenattribute und die Methoden für den Zugriff auf geschützte Ressourcen gehen über den Rahmen dieser Spezifikation hinaus und werden durch Begleitspezifikationen definiert.

Mein Autorisierungsserver verfügt über einen SOAP-Endpunkt (Webservice), mit dem der Ressourcenserver feststellen kann, ob das access_token gültig ist.

Carlos AG
quelle