JWT (JSON Web Token) è tipicamente composto da intestazione + payload + firma.
Intestazione
Contiene le informazioni sui metadati del JWT.
alg: l'algoritmo utilizzato per firmare il token.
typ: il tipo del token, sempre JWT.
{
"alg": "HS256",
"typ": "JWT"
}
Potrebbero essere presenti ulteriori intestazioni, ma quelle precedenti saranno sempre presenti.
Payload
Il payload contiene i claim del JWT. Gli header standard sono i seguenti:
iss: l'emittente, l'entità che genera e rilascia il JWT.
sub: il soggetto, l'entità identificata da questo token.
aud: il destinatario, il pubblico di destinazione per questo JWT.
exp: la scadenza, il timestamp in formato UNIX dopo il quale il token non deve essere accettato.
iat: issued at, specifica la data in cui il token è stato emesso.
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
Signature
La firma viene creata utilizzando l'Header Codificato, il Payload Codificato, un Segreto e un Algoritmo Crittografico.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
I seguenti algoritmi sono supportati sia dal componente JWT Client che Server.
Le librerie OpenSSL sono richieste per firmare e verificare il JWT, con un'eccezione.
I tre algoritmi ML-DSA sono gli algoritmi JOSE post-quantistici della RFC 9964, e sono l'eccezione appena citata: sono implementati interamente in Object Pascal nel pack sgcCrypto, quindi firmano e validano senza alcuna libreria OpenSSL presente. La firma è ML-DSA di FIPS 204 in modalità pura con una stringa di contesto vuota sull'input di firma JWS, trasportata nel token come base64url. Il firmatario è deterministico, quindi la stessa chiave e lo stesso input producono sempre la stessa firma.
I valori dell'enum sono jwtMLDSA44, jwtMLDSA65 e jwtMLDSA87, e l'header alg che scrivono è ML-DSA-44, ML-DSA-65 e ML-DSA-87. Il client firma con JWTOptions.Algorithms.MLDSA.PrivateKey, una chiave privata PEM in formato PKCS#8, e il server valida con JWTOptions.Algorithms.MLDSA.PublicKey, una chiave pubblica PEM in formato SubjectPublicKeyInfo. Il parameter set della chiave deve essere quello indicato dall'algoritmo: in caso contrario la firma genera un'eccezione e la validazione restituisce False.
Le firme sono grandi. Una firma ML-DSA-44 è di 2420 byte contro i 64 di ES256, quindi un token cresce di circa 3,2 KB di base64url, e una firma ML-DSA-87 di circa 6,2 KB. Verificare i limiti di dimensione degli header di tutto ciò che il token attraversa prima di adottarlo.
Le chiavi possono anche essere trasportate come JSON Web Key AKP, RFC 9964 sezioni 3 e 4. sgcMLDSA_ExportPublicJWK e sgcMLDSA_ExportPrivateJWK ne scrivono una, sgcMLDSA_ImportJWK legge entrambe le forme e sgcMLDSA_ImportJWKAsPEM converte una JWK direttamente nelle stringhe PEM che i due componenti leggono. Una JWK privata memorizza il seed di 32 byte in priv, l'unica forma privata definita dalla sezione 4, quindi una chiave privata espansa non può essere scritta come JWK. Tutte e quattro le funzioni sono dichiarate in sgcHTTP_JWT_MLDSA.
* Gli algoritmi ML-DSA richiedono il pack sgcCrypto. Senza di esso i valori dell'enum esistono comunque, quindi una form salvata con uno di essi si carica ancora, ma la firma genera un'eccezione e ogni token ML-DSA viene rifiutato.
TsgcHTTP_JWT_Client: Client JWT che consente di codificare e firmare JWT e di inviarli come intestazione Authorization nei protocolli HTTP e WebSocket.
TsgcHTTP_JWT_Server: Server JWT che consente di decodificare e validare i JWT ricevuti come Authorization Header nei protocolli HTTP e WebSocket.
* I componenti JWT richiedono almeno la versione Indy 10.6.0.5169 o sgcWebSockets Enterprise Edition.