8. Authorization Server-Provided Nonce (Nonce Fornito dal Server di Autorizzazione)
8. Authorization Server-Provided Nonce (Nonce Fornito dal Server di Autorizzazione)
Questa sezione specifica un meccanismo per utilizzare un nonce opaco fornito dal server per limitare la durata delle prove DPoP. Se non viene utilizzato alcun meccanismo di questo tipo, una parte malintenzionata che controlla il client (compreso possibilmente l'utente finale) può creare prove DPoP utilizzabili in qualsiasi momento in futuro.
L'inclusione di un valore di nonce fornito dal server di autorizzazione nella prova DPoP PUÒ essere utilizzata dal server di autorizzazione per limitare la durata delle prove DPoP. Spetta al server decidere quando emettere una nuova sfida di nonce DPoP e quando richiederne una, richiedendo così l'uso del valore di nonce nelle prove DPoP successive. La logica con cui un server prende questa decisione esula dallo scopo di questo documento.
Un server di autorizzazione PUÒ fornire un valore di nonce che il client deve includere nelle prove DPoP inviate. Lo fa rispondendo a una richiesta senza nonce con una risposta di errore HTTP 400 (Bad Request) con use_dpop_nonce come valore del codice di errore, come specificato nella Sezione 5.2 di [RFC6749]. Il server di autorizzazione include un'intestazione DPoP-Nonce nella risposta fornendo un valore di nonce da utilizzare quando si inviano richieste successive. Il valore del nonce DEVE essere imprevedibile. Questo stesso codice di errore viene anche utilizzato per fornire un nuovo valore di nonce nel caso in cui si verifichi una mancata corrispondenza del nonce. Il client riceve normalmente un errore use_dpop_nonce e il valore di nonce di accompagnamento, e riprova la richiesta con il nuovo valore di nonce fornito.
Ad esempio, in risposta a una richiesta di token senza nonce, quando il server di autorizzazione richiede un nonce, il server di autorizzazione può restituire un valore DPoP-Nonce come il seguente per fornire un valore di nonce da includere nella prova DPoP:
HTTP/1.1 400 Bad Request
DPoP-Nonce: eyJ7S_zG.eyJH0-Z.HX4w-7v
{
"error": "use_dpop_nonce",
"error_description":
"Authorization server requires nonce in DPoP proof"
}
Figura 20: Risposta HTTP 400 a una richiesta di token senza nonce
Altre intestazioni HTTP o campi JSON POSSONO essere inclusi nella risposta di errore, ma NON CI DEVE essere più di un'intestazione DPoP-Nonce.
Alla ricezione di un nonce, ci si aspetta che il client ritenti la richiesta di token utilizzando una prova DPoP che includa il valore di nonce fornito nel claim nonce della prova DPoP. Ecco un esempio di payload JWT non codificato per una tale prova DPoP contenente il nonce:
{
"jti": "-BwC3ESc6acc2lTc",
"htm": "POST",
"htu": "https://server.example.com/token",
"iat": 1562262616,
"nonce": "eyJ7S_zG.eyJH0-Z.HX4w-7v"
}
Figura 21: Payload di Prova DPoP con valore di nonce
Il nonce è opaco per il client.
Se il claim nonce di una prova DPoP non corrisponde esattamente a un nonce fornito di recente al client dal server di autorizzazione, il server di autorizzazione DEVE rifiutare la richiesta. La risposta di rifiuto PUÒ includere un'intestazione HTTP DPoP-Nonce fornendo un nuovo valore di nonce da utilizzare per le richieste successive.
L'intento è che il client debba mantenere solo un valore di nonce e che il server mantenga una finestra di nonce recenti. Detto questo, possono verificarsi situazioni transitorie in cui i valori di nonce memorizzati dal server e dal client non sono sincronizzati. Tuttavia, questa situazione si corregge da sola: con un messaggio di rifiuto, il server può inviare al client il valore di nonce che vuole vedere utilizzato, che il client può memorizzare e utilizzare per ritentare la richiesta. Anche se il client o il server scarta il proprio valore di nonce memorizzato, la situazione si corregge anche da sola poiché un nuovo valore di nonce può essere comunicato quando si risponde a una richiesta fallita o quando si effettua un nuovo tentativo.
Si noti che le applicazioni client basate su browser che utilizzano la condivisione delle risorse tra le origini (CORS) [WHATWG.Fetch] avranno accesso solo alle intestazioni di risposta HTTP menzionate nell'elenco di sicurezza CORS per impostazione predefinita. Per consentire all'applicazione di accedere e utilizzare il valore dell'intestazione di risposta HTTP DPoP-Nonce, il server deve renderlo disponibile all'applicazione includendo DPoP-Nonce nel valore dell'elenco delle intestazioni di risposta Access-Control-Expose-Headers.
8.1. Sintassi del Nonce
La sintassi ABNF per il nonce (che è la stessa della sintassi scope-token) da [RFC6749] è la seguente:
nonce = 1*NQCHAR
Figura 22: ABNF del Nonce
8.2. Fornire un Nuovo Valore di Nonce
Il server di autorizzazione decide quando fornire un nuovo valore di nonce da far utilizzare al client. Ci si aspetta che il client utilizzi un nonce fornito esistente nelle prove DPoP finché il server non fornisce un nuovo valore di nonce.
Il server di autorizzazione PUÒ fornire un nuovo nonce nello stesso modo in cui è stato fornito il nonce iniziale, utilizzando un'intestazione HTTP DPoP-Nonce in una risposta. Il campo di intestazione HTTP DPoP-Nonce utilizza la sintassi del nonce definita nella Sezione 8.1. Ogni volta che ciò accade, è necessario un ulteriore round-trip del protocollo.
Viene anche definito un metodo più efficiente per fornire un nuovo valore di nonce, che consiste nell'includere l'intestazione HTTP DPoP-Nonce nella risposta HTTP 200 (OK) di una richiesta precedente. Il client DEVE utilizzare il nuovo valore di nonce fornito per la richiesta di token successiva e tutte le richieste di token successive finché il server di autorizzazione non fornisce un nuovo nonce.
Le risposte contenenti un'intestazione HTTP DPoP-Nonce DOVREBBERO essere non memorizzabili nella cache (ad esempio, utilizzando Cache-Control: no-store in una risposta a una richiesta GET) per impedire che la risposta venga utilizzata per servire una richiesta successiva e, di conseguenza, che venga utilizzato un valore di nonce obsoleto.
Ecco un esempio di una risposta 200 OK che fornisce il valore di nonce successivo:
HTTP/1.1 200 OK
Cache-Control: no-store
DPoP-Nonce: eyJ7S_zG.eyJbYu3.xQmBj-1
Figura 23: Risposta HTTP 200 che fornisce il valore di nonce successivo