Le TCK officiel MicroProfile JWT 2.1 valide qu’une implémentation accepte, rejette et expose correctement un éventail de tokens forgés contre une application Arquillian de référence — clés inline, JWKS, JWE, claims standard, claims MP, transport Authorization et cookie, rotation de clés, signatures falsifiées, exp/nbf/iat aux bornes. Cervantes le passe à 206 / 206 sur la version 2.1 (mai 2026, jalon M6).
Statut
| Métrique | Valeur |
|---|---|
Tests exécutés |
206 |
Réussis |
206 ✅ |
Échoués |
0 |
Erreurs |
0 |
Ignorés |
0 |
Tout écart ultérieur doit être journalisé dans TCK.md du dépôt avec : nom de test, motif, plan de correction.
Prérequis
L’artefact org.eclipse.microprofile.jwt:microprofile-jwt-auth-tck:2.1 (et son classifier tests) est désormais disponible sur Maven Central — il se télécharge automatiquement. Le runner installe également cassini-tck dans le M2 local pour disposer du CassiniTestHarness.
sdk env # Java 25 + Maven 3.9.16
./mvnw -ntp install -DskipTests # installe cervantes-core, cervantes-jaxrs, cervantes-cdi-vauban, …
Exécution du runner
Le script run-official-tck-mp-jwt-2.1.sh à la racine du dépôt orchestre toutes les variantes.
# Smoke — un test rapide pour valider l'installation
./run-official-tck-mp-jwt-2.1.sh
# Suite complète — équivalent du TCK officiel à 206 tests
./run-official-tck-mp-jwt-2.1.sh all
# Test ciblé via -Dtest=
./run-official-tck-mp-jwt-2.1.sh -Dtest=PublicKeyAsPEMTest
Le runner exécute Arquillian. Le rapport Surefire atterrit dans cervantes-tck/target/surefire-reports/.
Architecture du runner
cervantes-tck est volontairement hors reactor : son pom.xml est en modelVersion 4.0.0 standalone, sans <parent>. Gabarit calqué sur heisenberg-tck.
|
Ce détachement est imposé par ShrinkWrap Maven Resolver 3.3, transitive du TCK officiel, qui ne sait pas parser les POMs Model 4.1.0 et crashe sur le reactor Vidocq. La règle est documentée à la racine du workspace : ne pas réintégrer |
Stack assemblée par le runner :
| Couche | Composant |
|---|---|
Spec |
|
Implémentation MP JWT |
|
Container CDI |
Vauban ( |
Container Arquillian |
|
Transport HTTP |
Chappe ( |
Cadre de test |
Arquillian + REST (le TCK MP JWT n’est pas TestNG-only contrairement au TCK MP FT) |
Exclusions documentées
Deux exclusions, non-applicables au profil Core + JWT visé par Cervantes :
| Exclusion | Justification |
|---|---|
Tests |
Tests destinés au profil container servlet Jakarta EE Full. Cervantes vise le profil Core (MicroProfile) — pas d’engagement Servlet 6.1. Le rôle Servlet est tenu par Foy, hors périmètre de cette implémentation MP JWT. |
Groupe TestNG |
Tests marqués optional par la spec pour l’intégration Jakarta EE Security 3.0. Non requis pour la conformité MP JWT 2.1. |
Les exclusions sont listées dans le fichier suite Arquillian/TestNG de cervantes-tck/src/test/resources/. Une exclusion ajoutée à l’avenir doit être tracée dans TCK.md avec sa justification.
Écarts résolus pendant la course au 100 %
Le TCK a révélé plusieurs écarts entre la spec et l’implémentation initiale ; tous ont été corrigés dans le moteur, pas masqués par des exclusions :
| Composant | Écart corrigé |
|---|---|
|
Charge HTTP paresseuse + auto-détection PEM vs JWKS sur la même URL + relecture de l’URL après démarrage du serveur (le port n’est connu qu’après bind). |
|
Ajout du header |
|
Parsing de clé privée JWK ( |
|
Contrôle explicite de l’algorithme requis + vérification |
|
|
|
Unwrap |
|
Extraction token via cookie (§9.2.3), distinction des cas d’erreur, comportement anonyme sur token absent. |
|
Principal anonyme → |
Prérequis livrés en amont
Deux fixes externes ont été nécessaires pour atteindre 206/206 :
-
cassini — patch
@Context SecurityContextinjecté dans une ressource pour refléter le JWT duJwtAuthenticationFilter. Mergé sur main de Cassini, REST TCK 4.0 (2535 tests) préservé. -
vauban — fix VAU-INJ-PRIM : le
TypeMapperexposait un point d’injection primitif (boolean) commeClassType[name=boolean]au lieu dePrimitiveType, ce qui faisait échouer silencieusement l’injection@Claim boolean. Fix + test de régressionPrimitiveQualifiedInjectionTest. Mergé sur main de Vauban.
Contrat qualité
Toute modification structurelle de cervantes-core, cervantes-cdi-vauban ou cervantes-jaxrs doit préserver le score 206 / 206 avant merge. Une régression TCK est bloquante au sens CI : la PR ne passe pas.
Pour aller plus loin
-
Fonctionnement interne — comprendre ce que le TCK valide.
-
Référence — annotations et clés couvertes par les tests.
-
BUG.md — bugs reproductibles tracés.
-
TCK.md — historique des scores.