3. Concept (Konzept)
3. Concept (Konzept)
Die wichtigste Datenstruktur, die durch diese Spezifikation eingeführt wird, ist das DPoP-Proof-JWT (DPoP proof JWT), das als Header in einer HTTP-Anforderung gesendet wird, wie unten beschrieben. Der Client verwendet ein DPoP-Proof-JWT, um nachzuweisen, dass er den privaten Schlüssel besitzt, der einem bestimmten öffentlichen Schlüssel entspricht.
Grob gesprochen ist ein DPoP-Proof eine Signatur über:
-
einige Daten der HTTP-Anforderung, an die er angehängt ist,
-
einen Zeitstempel,
-
eine eindeutige Kennung,
-
eine optionale vom Server bereitgestellte Nonce, und
-
einen Hash des zugehörigen Zugriffstokens, wenn ein Zugriffstoken in der Anforderung vorhanden ist.
+------------+ +---------------+
| |--(A)-- Token-Anforderung ----------->| |
| Client | (DPoP-Proof) | Autorisierungs|
| | | server |
| |<-(B)-- DPoP-gebundenes Zugriffstoken-| |
| | (token_type=DPoP) +---------------+
| |
| |
| | +---------------+
| |--(C)-- DPoP-gebundenes Zugriffstoken>| |
| | (DPoP-Proof) | Ressourcen- |
| | | server |
| |<-(D)-- Geschützte Ressource ---------| |
| | +---------------+
+------------+
Abbildung 1: Grundlegender DPoP-Ablauf
Die grundlegenden Schritte eines OAuth-Ablaufs mit DPoP (ohne optionale Nonce) sind in Abbildung 1 dargestellt.
A. In einer Token-Anforderung sendet der Client eine Autorisierungsberechtigung (z. B. einen Autorisierungscode, ein Refresh-Token usw.) an den Autorisierungsserver, um ein Zugriffstoken (und möglicherweise ein Refresh-Token) zu erhalten. Der Client fügt der Anforderung einen DPoP-Proof in einem HTTP-Header bei.
B. Der Autorisierungsserver bindet (sender-constrains) das Zugriffstoken an den öffentlichen Schlüssel, den der Client im DPoP-Proof beansprucht hat; d. h. das Zugriffstoken kann nicht ohne Nachweis des Besitzes des entsprechenden privaten Schlüssels verwendet werden. Wenn ein Refresh-Token an einen öffentlichen Client ausgegeben wird, wird es ebenfalls an den öffentlichen Schlüssel aus dem DPoP-Proof gebunden.
C. Um das Zugriffstoken zu verwenden, muss der Client den Besitz des privaten Schlüssels nachweisen, indem er der Anforderung erneut einen Header mit einem DPoP-Proof der Anforderung hinzufügt. Der Ressourcenserver muss Informationen über den öffentlichen Schlüssel erhalten, an den das Zugriffstoken gebunden ist. Diese Informationen können entweder direkt im Zugriffstoken kodiert sein (für JWT-strukturierte Zugriffstoken) oder über den Token-Introspektionsendpunkt (nicht dargestellt) bereitgestellt werden. Der Ressourcenserver überprüft, ob der öffentliche Schlüssel, an den das Zugriffstoken gebunden ist, mit dem öffentlichen Schlüssel des DPoP-Proofs übereinstimmt. Er verifiziert auch, dass der Hash des Zugriffstokens im DPoP-Proof mit dem in der Anforderung vorgelegten Zugriffstoken übereinstimmt.
D. Wenn die Signaturprüfung fehlschlägt oder die Daten im DPoP-Proof falsch sind (z. B. stimmt die Ziel-URI nicht mit dem URI-Claim im DPoP-Proof-JWT überein), verweigert der Ressourcenserver die Bedienung der Anforderung. Das Zugriffstoken selbst muss natürlich auch in jeder anderen Hinsicht gültig sein.
Der hier vorgeschlagene DPoP-Mechanismus ist keine Client-Authentifizierungsmethode. Tatsächlich ist einer der Hauptanwendungsfälle für DPoP öffentliche Clients (z. B. Single-Page-Anwendungen und Anwendungen auf Benutzergeräten), die keine Client-Authentifizierung verwenden. Dennoch ist DPoP so konzipiert, dass es mit private_key_jwt und allen anderen Client-Authentifizierungsmethoden kompatibel ist.
DPoP gewährleistet keine direkte Nachrichtenintegrität, sondern verlässt sich zu diesem Zweck auf die TLS-Schicht. Siehe Abschnitt 11 für weitere Details.