Exemple de Validation JWT en Java
⚠️ Avis Important : Ceci est un exemple basique à des fins de démonstration uniquement. Pour une utilisation en production, veuillez rechercher et mettre en œuvre les meilleures pratiques spécifiques à votre pile logicielle, vos exigences de sécurité et votre environnement de déploiement. Suivez toujours les directives de sécurité de votre organisation et envisagez d'utiliser des bibliothèques et frameworks JWT établis.
📝 Remarque : Cet exemple montre le téléchargement de JWKS et la mise en cache de fichiers à des fins éducatives. Dans les environnements de production, vous pouvez choisir de mettre en œuvre la gestion des clés JWKS différemment en fonction de votre infrastructure - comme en utilisant la gestion de la configuration, les variables d'environnement, ou votre stratégie de mise en cache préférée.
Cet exemple montre comment valider les jetons JWT de Rokt en utilisant Java.
Prérequis
Ajoutez les dépendances suivantes à votre pom.xml :
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
Exemple Complet
package com.rokt;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import java.math.BigInteger;
import java.security.Key;
import java.security.KeyFactory;
import java.security.spec.ECPublicKeySpec;
import java.security.spec.ECParameterSpec;
import java.security.spec.ECPoint;
import java.util.Base64;
import java.util.Date;
public class RoktJwtValidator {
// Copier le jeton de test depuis la page d'aperçu
private static final String SAMPLE_JWT_TOKEN = "PASTE_TEST_TOKEN_HERE";
// URL de l'endpoint JWKS
private static final String JWKS_URL = "https://public-api.rokt.com/.well-known/jwks.json";
public static void main(String[] args) {
try {
System.out.println("=== Validateur JWT Java ===");
System.out.println("Jeton: " + SAMPLE_JWT_TOKEN.substring(0, 50) + "...");
System.out.println("URL JWKS: " + JWKS_URL);
System.out.println();
// Télécharger et mettre en cache JWKS
String jwksJson = downloadAndCacheJWKS(JWKS_URL, JWKS_CACHE_FILE);
System.out.println("JWKS téléchargé et mis en cache avec succès");
// Extraire les coordonnées de la clé publique de JWKS
String[] coordinates = extractKeyCoordinates(jwksJson);
String xCoordinate = coordinates[0];
String yCoordinate = coordinates[1];
// Créer une clé publique ECDSA à partir des coordonnées JWK
Key publicKey = createECDSAPublicKey(xCoordinate, yCoordinate);
// Valider le jeton JWT
Claims claims = validateJWT(SAMPLE_JWT_TOKEN, publicKey);
System.out.println("✅ Validation du jeton réussie !");
System.out.println("ID de la campagne: " + claims.get("cid"));
System.out.println("ID de la création: " + claims.get("crid"));
System.out.println("RCLID: " + claims.get("rclid"));
System.out.println("Émis à: " + new Date(claims.getIssuedAt().getTime()) + " UTC");"
} catch (Exception e) {
System.err.println("❌ Échec de la validation du jeton: " + e.getMessage());
e.printStackTrace();
}
}
private static Claims validateJWT(String token, Key publicKey) {
return Jwts.parserBuilder()
.setSigningKey(publicKey)
.setAllowedClockSkewSeconds(60) // Autoriser un décalage d'horloge d'une minute
.build()
.parseClaimsJws(token)
.getBody();
}
private static Key createECDSAPublicKey(String xCoordinate, String yCoordinate) throws Exception {
// Décoder les coordonnées encodées en base64url
byte[] xBytes = Base64.getUrlDecoder().decode(xCoordinate);
byte[] yBytes = Base64.getUrlDecoder().decode(yCoordinate);
// Convertir en BigInteger
BigInteger x = new BigInteger(1, xBytes);
BigInteger y = new BigInteger(1, yBytes);
// Utiliser la courbe standard P-256 à partir de AlgorithmParameters
java.security.AlgorithmParameters parameters = java.security.AlgorithmParameters.getInstance("EC");
parameters.init(new java.security.spec.ECGenParameterSpec("secp256r1"));
ECParameterSpec ecParameterSpec = parameters.getParameterSpec(ECParameterSpec.class);
// Créer la spécification de clé publique ECDSA
ECPublicKeySpec spec = new ECPublicKeySpec(
new ECPoint(x, y),
ecParameterSpec
);
// Générer la clé publique
KeyFactory keyFactory = KeyFactory.getInstance("EC");
return keyFactory.generatePublic(spec);
}
}
Exemple d'Entrée/Sortie
Entrée
- Jeton JWT (JWT Token): Copiez le jeton de test depuis la page d'aperçu
- Source de la clé publique (Public Key Source):
https://public-api.rokt.com/.well-known/jwks.json
Sortie
=== Validateur Java JWT ===
Token: eyJhbGciOiJFUzI1NiIsImtpZCI6InJva3Qtc2lnbmluZy1rZX...
JWKS URL: https://public-api.rokt.com/.well-known/jwks.json
Téléchargement de JWKS depuis : https://public-api.rokt.com/.well-known/jwks.json
JWKS mis en cache dans : jwks_cache.json
JWKS téléchargé et mis en cache avec succès
✅ Validation du jeton réussie !
ID de la campagne : 3436085368692408324
ID créatif : 3437732754935906308
RCLID : 7db958dbd232247a4a8285a34d22fe0f4e9affa463bf5ee54e26721ab0df0e23
Émis à : Mer 20 Août 15:10:01 AEST 2025 UTC
Comment exécuter
Utilisation de Maven (Recommandé)
- Créez un projet Maven avec
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.rokt</groupId>
<artifactId>jwt-validator</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>15</maven.compiler.source>
<maven.compiler.target>15</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
- Enregistrez le code dans
src/main/java/com/rokt/RoktJwtValidator.java - Exécutez :
mvn compile exec:java -Dexec.mainClass="com.rokt.RoktJwtValidator"
Utilisation des fichiers JAR directement
- Téléchargez les fichiers JAR de JJWT
- Enregistrez le code dans
RoktJwtValidator.java - Compilez :
javac -cp ".:jjwt-api-0.11.5.jar:jjwt-impl-0.11.5.jar:jjwt-jackson-0.11.5.jar" RoktJwtValidator.java - Exécutez :
java -cp ".:jjwt-api-0.11.5.jar:jjwt-impl-0.11.5.jar:jjwt-jackson-0.11.5.jar" RoktJwtValidator
Remarques
-
La clé publique est récupérée à partir de l'endpoint JWKS de Rokt
-
L'exemple utilise l'algorithme ECDSA-256 (ES256) pour la vérification de la signature
-
Envisagez de mettre en cache la clé publique pour améliorer les performances