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
- token_type: invece di bearer, questo valore è DPoP.
- cnf: la richiesta di conferma di impronta JWK restituisce un hash della chiave pubblica.
Risposta di introspezione di esempio:
{
...,
"cnf": {
"jkt": "yrFAH18WFPml9e9IIo6rB_fLdFX1pdbMgIcd_fW_4aM="
},
"token_type": "DPoP",
...
}