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.

jwt

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

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Contatti Free Service Chi sono Highlight Portfolio Blog & News