Dimostrazione della prova di possesso ( DPoP )

DPoP fornisce un meccanismo che consente al cliente di ottenere token di tipo " OAuth " vincolati al mittente, fornendo una prova di possesso di una coppia di chiavi pubblica-privata.

La specifica è in fase di bozza: https://datatracker.ietf.org/doc/html/draft-ietf-oauth-dpop-11.

Intestazione HTTP DPoP

L'intestazione DPoP è un JWT firmato che include le informazioni chiave per la prova di possesso.

L'intestazione JOSE del JWT DPoP deve contenere almeno i seguenti parametri:

Parametro Descrizione
tipo Il tipo di JWT. Questo valore deve essere "dpop + jwt".
alg L'algoritmo di firma. I valori validi sono: RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384, ES512
JWK Una JWK (JSON Web Key) che rappresenta la chiave pubblica. Non deve contenere una chiave privata.

Esempio intestazione JOSE:

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

Il payload del JWT DPoP deve contenere almeno le seguenti richieste:

Nome richiesta Descrizione
jti Identificativo univoco per questo JWT.
htm Il metodo HTTP della richiesta a cui è allegato il JWT.
htu L'URI di destinazione HTTP, senza le parti di query e di frammento. Si tratta dell'endpoint PAR (Push Authorization Request) o dell'endpoint token.
iat Data / ora di creazione del JWT.

Esempio di payload JWT:

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

Il JWT DPoP deve essere firmato con una chiave privata e la firma deve essere verificabile con la chiave pubblica fornita nell'intestazione JOSE del JWT. Il JWT non deve essere valido per più di 30 minuti. Se non è presente alcuna richiesta exp , si presume che la scadenza per questo JWT sia 30 minuti dopo la data / ora di creazione specificata in iat.

Il JWT viene inviato in un'intestazione denominata DPoP.

Esempio di richiesta:


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

Autorizza richiesta

La richiesta di autorizzazione include un'impronta della chiave web JSON, nel parametro di query o nel corpo POST.

Parametro Descrizione
dpop_jkt Anteprima della chiave Web JSON da associare a questa richiesta di autorizzazione.
https://<tenantId>/oauth2/authorize?grant_type=authorization_code&client_id=<clientId>&redirect_uri=<redirect_uri>&dpop_jkt=<dpop_jkt>&...

Il codice di autorizzazione generato per questa richiesta verrà collegato a tale impronta e utilizzato per la convalida alla richiesta del token. Ciò impedisce che il codice di autorizzazione venga rubato e utilizzato da un altro utente che non dispone della stessa chiave privata per firmare la richiesta di token durante lo scambio del codice per i token.

Si consiglia di utilizzare richieste di autorizzazione inviate (PAR) o oggetti di richiesta in combinazione con DPoP, per inviare l'impronta dpop_jkt digitale in modo sicuro. In alternativa, con PAR, è possibile utilizzare l'intestazione DPoP invece di dpop_jkt. Per i dettagli, consultare la precedente sezione DPoP HTTP header . Le richieste di autorizzazione inviate possono essere applicate selezionando Require pushed authorization request (PAR) quando si configura l'applicazione OpenID Connect.

Richiesta token

Le richieste di token di accesso e di aggiornamento devono avere un'intestazione HTTP DPoP. Per i dettagli, consultare la precedente sezione DPoP HTTP header .

Per il flusso del codice di autorizzazione, l'impronta di questo JWK deve corrispondere all'impronta di JWK (dpop_jkt) inviata durante la richiesta di autorizzazione.

Esempio di richiesta:


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

Il risultato dell'esecuzione di questo flusso è una serie di token collegati alla prova di possesso. Questo può essere convalidato con l'introspezione del token.

Introspezione token

Quando un token di accesso DPoP viene analizzato, vengono restituite ulteriori richieste.
  • token_type: invece di bearer, questo valore è DPoP.
  • cnf: la richiesta di conferma di impronta JWK restituisce un hash della chiave pubblica.
I client che eseguono l'introspezione del token devono convalidare il bind del DPoP del token di accesso confrontando l'hash della chiave pubblica con l'asserzione cnf jkt nella risposta di introspezione.

Risposta di introspezione di esempio:


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