Fournir une preuve de possession ( DPoP )

DPoP offre un mécanisme permettant à un client d'obtenir des jetons d' OAuth s liés à l'expéditeur en fournissant une preuve de possession d'une paire de clés publique-privée.

Le cahier des charges est encore à l'état de projet : https://datatracker.ietf.org/doc/html/draft-ietf-oauth-dpop-11.

DPoP HTTP en-tête

L'en-tête « DPoP » est un JWT signé qui contient des informations essentielles permettant de prouver la possession.

L'en-tête JOSE du JWT DPoP doit contenir au moins les paramètres suivants :

Paramètre Descriptif
type Le type de JWT. Cette valeur doit être « dpop+jwt ».
ALG L'algorithme de signature. Les valeurs valides sont : RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384, ES512
JWK Une clé Web JSON (JWK) représentant la clé publique. Ne doit pas contenir de clé privée.

Exemple d'en-tête JOSE :

{
  "typ": "dpop+jwt",
  "alg": "RS256",
  "jwk": {
    "kty": "RSA",
    "n": "...",
    "e": "AQAB"
  }
}

Le corps du JWT « DPoP » doit contenir au moins les revendications suivantes :

Nom de la réclamation Descriptif
jti Identifiant unique de ce JWT.
htm La méthode « HTTP » de la requête à laquelle le JWT est associé.
htu L'URI cible de l' HTTP, sans les parties de requête ni de fragment. Il s'agirait du point de terminaison PAR (Pushed Authorization Request) ou du point de terminaison des jetons.
iat Horodatage de création du JWT.

Exemple de charge utile JWT :

{
  "jti": "3765f59c-43cd-4cf8-8180-73bc9ae4ff3c",
  "htm": "POST",
  "htu": "https://<tenant-hostname>/oauth2/token",
  "iat": 1661847227
}

Le JWT « DPoP » doit être signé à l'aide d'une clé privée, et la signature doit pouvoir être vérifiée à l'aide de la clé publique fournie dans l'en-tête JOSE du JWT. Le JWT ne doit pas être valide pendant plus de 30 minutes. En l'absence exp de requête, la durée de validité de ce JWT est supposée être de 30 minutes à compter de l'horodatage de création indiqué dans iat.

Le JWT est envoyé dans un en-tête nommé DPoP.

Exemple de requête :


curl -ki https://<tenantId>/oauth2/token
 -H "DPoP: eyJ0eXAiOiJkcG9wK2p3dCIsImFsZyI6Il..."
 -d "grant_type=client_credentials&client_secret=<secret>&client_id=<clientId>"

Autorisation d'une demande

La demande d'autorisation comprend l'empreinte digitale de la clé Web JSON, dans le paramètre de requête ou dans le corps de la requête POST.

Paramètre Descriptif
dpop_jkt Empreinte digitale de la clé Web JSON à associer à cette demande d'autorisation.
https://<tenantId>/oauth2/authorize?grant_type=authorization_code&client_id=<clientId>&redirect_uri=<redirect_uri>&dpop_jkt=<dpop_jkt>&...

Le code d'autorisation généré pour cette requête serait associé à cette empreinte digitale et utilisé pour la validation lors de la demande de jeton. Cela empêche le code d'autorisation d'être volé et utilisé par un autre système ne disposant pas de la même clé privée pour signer la demande de jetons lors de l'échange du code contre des jetons.

Il est recommandé d'utiliser les demandes d'autorisation poussées (PAR) ou les objets de demande en association avec DPoP, pour transmettre l'empreinte dpop_jkt numérique de manière sécurisée. dpop_jktSinon, avec PAR, l'en-tête DPoP peut être utilisé à la place. Pour plus de détails, voir DPoP HTTP header la section ci-dessus. Les demandes d'autorisation poussées peuvent être activées en cochant Require pushed authorization request (PAR) la case correspondante lors de la configuration de l'application OpenID Connect.

Demande de jeton

Les requêtes de jetons d'accès et de rafraîchissement doivent obligatoirement comporter un en-tête « DPoP HTTP ». Pour plus de détails, voir DPoP HTTP header la section ci-dessus.

Dans le cadre du processus d'autorisation par code, l'empreinte digitale de ce JWK doit correspondre à l'empreinte digitale du JWK (dpop_jkt) qui a été envoyée lors de la demande d'autorisation.

Exemple de requête :


curl -ki https://<tenantId>/oauth2/token
 -H "DPoP: eyJ0eXAiOiJkcG9wK2p3dCIsImFsZyI6Il..."
 -d "grant_type=client_credentials&client_secret=<secret>&client_id=<clientId>"

Le résultat de l'exécution de ce processus est un ensemble de jetons liés à la preuve de possession. Cela peut être vérifié par introspection du jeton.

Introspection des jetons

Lorsqu'un jeton d'accès DPoP est analysé, des revendications supplémentaires sont renvoyées.
  • token_type: Au lieu de bearer, cette valeur serait DPoP.
  • cnf: La fonction de vérification de l'empreinte digitale JWK renvoie un hachage de la clé publique.
Les clients qui procèdent à l'introspection du jeton doivent vérifier la validité de la liaison DPoP du jeton d'accès en comparant le hachage de la clé publique à la cnf jkt revendication figurant dans la réponse d'introspection.

Exemple de réponse à l'exercice d'introspection :


{
    ...,
    "cnf": {
        "jkt": "yrFAH18WFPml9e9IIo6rB_fLdFX1pdbMgIcd_fW_4aM="
    },
    "token_type": "DPoP",
    ...
}