La firma è facoltativa. Un JWT valido può essere costituito solo dalle sezioni di intestazione e payload. Tuttavia, utilizziamo la sezione della firma per verificare il contenuto dell’intestazione e il payload per L’autorizzazione si sicurezza.
Più comunemente, il JWT contiene le “affermazioni” di un utente. Questi rappresentano i dati sull’utente, che l’API può utilizzare per concedere autorizzazioni o tracciare l’utente che fornisce il token. La decodifica del token consente all’applicazione di utilizzare i dati e la convalida consente all’applicazione di considerare attendibile che il JWT sia stato generato da una fonte attendibile.
Diamo un’occhiata a come possiamo decodificare e convalidare un token in Java.
Decodifica di un JWT
Possiamo decodificare un token utilizzando le funzioni Java integrate.
Per prima cosa, suddividiamo il token nelle sue sezioni:
String[] chunks = token.split("\\.");
Dovremmo notare che l’espressione regolare passata a String.split utilizza un ‘. ‘ con escape. carattere da evitare ‘.’ che significa “qualsiasi carattere”.
Il nostro array di blocchi ora dovrebbe avere due o tre elementi corrispondenti alle sezioni del JWT.
Successivamente, decodifichiamo l’intestazione e le parti del payload utilizzando un decodificatore base64url:
Base64.Decoder decoder = Base64.getUrlDecoder();
String header = new String(decoder.decode(chunks[0]));
String payload = new String(decoder.decode(chunks[1]));
Eseguiamo questo codice con un JWT (possiamo decodificare online per confrontare i risultati):
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJBQkMxMjMiLCJleHAiOjE2ODQ1NjcyODgsImlhdCI6MTY4NDQ4MDg4OH0._p0r5iAzPfJCMamBSRGNSqQJu4xqtjyx7_EtQN1f9jE
L’output ci darà l’intestazione decodificata di qualsiasi payload:
{"alg":"HS256","typ":"JWT"}{"sub":"ABC123", "exp": 1684567288,"iat": 1684480888}
Se in un JWT sono definite solo le sezioni di intestazione e payload, abbiamo finito e le informazioni sono state decodificate correttamente.
Verifica del JWT
Successivamente, possiamo verificare l’integrità dell’intestazione e del payload per assicurarci che non siano stati alterati utilizzando la sezione della firma.
Dipendenze
Per la verifica, possiamo aggiungere jjwt al nostro pom.xml :
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
Abbiamo bisogno di una versione di questa libreria dalla versione 0.7.0 in poi.
Configurazione dell’algoritmo di firma e della specifica della chiave
Per iniziare a verificare il payload e l’intestazione, abbiamo bisogno sia dell’algoritmo di firma utilizzato originariamente per firmare il token sia della chiave segreta:
SignatureAlgorithm sa = SignatureAlgorithm.HS256;
SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), sa.getJcaName());
In questo esempio, abbiamo codificato il nostro algoritmo di firma in HS256 . Tuttavia, potremmo decodificare il JSON dell’intestazione e leggere il campo alg per ottenere questo valore.
Dovremmo anche notare che la variabile secretKey è una rappresentazione String della chiave segreta. Potremmo fornirlo alla nostra applicazione tramite la sua configurazione o tramite un’API REST esposta dal servizio che emette il JWT.
Esecuzione della verifica
Ora che abbiamo l’algoritmo di firma e la chiave segreta, possiamo iniziare a eseguire la verifica.
Ricombiniamo l’intestazione e il payload in un JWT senza segno, unendoli con il ‘.’ delimitatore:
String tokenWithoutSignature = chunks[0] + "." + chunks[1];
String signature = chunks[2];
Ora abbiamo il token non firmato e la firma fornita. Possiamo usare la libreria per convalidarlo:
DefaultJwtSignatureValidator validator = new DefaultJwtSignatureValidator(sa, secretKeySpec);
if (!validator.isValid(tokenWithoutSignature, signature)) {
throw new Exception("Could not verify JWT token integrity!");
}
Analizziamolo.
Innanzitutto, creiamo un validatore con l’algoritmo e il segreto scelti. Quindi gli forniamo i dati del token non firmato e la firma fornita.
Quindi il validatore genera una nuova firma e la confronta con la firma fornita. Se sono uguali, abbiamo verificato l’integrità dell’intestazione e del payload
Terminato
abbiamo esaminato la struttura di un JWT e come decodificarlo in JSON.
Quindi abbiamo utilizzato una libreria per verificare l’integrità di un token utilizzando la sua firma, l’algoritmo e la chiave segreta.
Se in questo articolo ci sono degli errori o hai dei suggerimenti, faccelo sapere!