![]()
Come Decodificare un token JWT in Java
Un JSON Web Token (JWT) viene spesso utilizzato nella sicurezza dell’API REST. Anche se il token può essere analizzato da framework come Spring Security OAuth , potremmo voler elaborare il token nel nostro codice.
Un JSON Web Token (JWT) viene spesso utilizzato nella sicurezza dell’API REST. Anche se il token può essere analizzato da framework come Spring Security OAuth , potremmo voler elaborare il token nel nostro codice.
In questo tutorial, decodificheremo e verificheremo l’integrità di un JWT .
Struttura di un JWT
Innanzitutto, capiamo la struttura di un JWT :
- Header
- Payload
- Signature (firma)
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.

Le sezioni sono rappresentate come stringhe con codifica base64url separate da un delimitatore punto (‘.’). In base alla progettazione, chiunque può decodificare un JWT e leggere il contenuto delle sezioni di intestazione e payload. Ma abbiamo bisogno di accedere alla chiave segreta utilizzata per creare la firma per verificare l’integrità di un token.
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 = newString(decoder.decode(chunks[0]));String payload = newString(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 = newSecretKeySpec(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 = newDefaultJwtSignatureValidator(sa, secretKeySpec);if(!validator.isValid(tokenWithoutSignature, signature)) { thrownewException("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!
📖 Letto da: 14








