# 🔧 Correction du Mapper Keycloak - ProblĂšme realm_access dupliquĂ© **Date :** 17 novembre 2025 **ProblĂšme :** Token JWT invalide avec `realm_access` dupliquĂ© **Impact :** VĂ©rification du token dĂ©sactivĂ©e (sĂ©curitĂ© rĂ©duite) --- ## 🚹 PROBLÈME IDENTIFIÉ Le token JWT gĂ©nĂ©rĂ© par Keycloak contient `realm_access` **deux fois** avec des types diffĂ©rents : ```json { "realm_access": { "roles": ["SUPER_ADMIN", "offline_access", ...] }, "realm_access": ["SUPER_ADMIN", "offline_access", ...] } ``` Cela crĂ©e un **JSON invalide** car une clĂ© ne peut pas apparaĂźtre deux fois dans un objet JSON. **Erreur Quarkus :** ``` Unable to parse what was expected to be the JWT Claim Set JSON Additional details: [[16] Invalid JSON.] ``` --- ## 🔍 CAUSE Un **mapper de protocole** dans Keycloak crĂ©e `realm_access` comme tableau, alors que le mapper standard crĂ©e dĂ©jĂ  `realm_access.roles` comme objet. **Mappers en conflit :** 1. Mapper standard Keycloak : CrĂ©e `realm_access.roles` (objet) ✅ 2. Mapper personnalisĂ© : CrĂ©e `realm_access` (tableau) ❌ --- ## ✅ SOLUTION ### Étape 1 : Identifier le mapper problĂ©matique 1. **Se connecter Ă  Keycloak Admin Console** - URL : `https://security.lions.dev/admin` - Realm : `unionflow` 2. **Naviguer vers le client** - Menu : `Clients` → `unionflow-client` - Onglet : `Mappers` 3. **Identifier le mapper en double** - Chercher un mapper qui crĂ©e `realm_access` comme tableau - Le mapper standard devrait crĂ©er `realm_access.roles` (objet) - Un mapper personnalisĂ© crĂ©e probablement `realm_access` (tableau) ### Étape 2 : Supprimer ou corriger le mapper **Option A : Supprimer le mapper en double (RECOMMANDÉ)** 1. Dans la liste des mappers, identifier celui qui crĂ©e `realm_access` comme tableau 2. Cliquer sur le mapper 3. VĂ©rifier le `Token Claim Name` : s'il est `realm_access` (sans `.roles`), c'est le problĂšme 4. **Supprimer ce mapper** **Option B : Corriger le mapper** 1. Cliquer sur le mapper problĂ©matique 2. Modifier le `Token Claim Name` de `realm_access` vers `realm_access.roles` 3. Ou changer le type de mapper pour qu'il crĂ©e un objet au lieu d'un tableau ### Étape 3 : VĂ©rifier la configuration Le mapper standard Keycloak devrait ĂȘtre : - **Name** : `realm roles` (ou similaire) - **Mapper Type** : `User Realm Role` - **Token Claim Name** : `realm_access.roles` (avec `.roles`) - **Add to access token** : `ON` - **Add to ID token** : `ON` (optionnel) ### Étape 4 : RĂ©activer la vĂ©rification du token Une fois le mapper corrigĂ© : 1. **Modifier `application.properties`** ```properties quarkus.oidc.verify-access-token=true ``` 2. **RedĂ©marrer l'application** 3. **Tester l'authentification** - Se connecter - VĂ©rifier les logs : plus d'erreur de parsing JSON - VĂ©rifier que les rĂŽles sont correctement extraits --- ## 🔍 VÉRIFICATION ### VĂ©rifier le token JWT 1. **DĂ©coder le token** sur [jwt.io](https://jwt.io) 2. **VĂ©rifier la structure** : ```json { "realm_access": { "roles": ["SUPER_ADMIN", "offline_access", ...] } } ``` ✅ **Correct** : `realm_access` est un objet avec `roles` ❌ **Incorrect** : `realm_access` apparaĂźt deux fois ou est un tableau ### VĂ©rifier les logs Quarkus **Avant correction :** ``` ERROR [io.qu.oi.ru.CodeAuthenticationMechanism] Access token verification has failed: Unable to parse... ``` **AprĂšs correction :** ``` INFO [io.qu.oi.ru.CodeAuthenticationMechanism] Authentication successful ``` --- ## 📋 CHECKLIST DE CORRECTION - [ ] Se connecter Ă  Keycloak Admin Console - [ ] Aller dans `Clients` → `unionflow-client` → `Mappers` - [ ] Identifier le mapper qui crĂ©e `realm_access` comme tableau - [ ] Supprimer ou corriger le mapper problĂ©matique - [ ] VĂ©rifier que seul le mapper standard existe (avec `realm_access.roles`) - [ ] Modifier `application.properties` : `quarkus.oidc.verify-access-token=true` - [ ] RedĂ©marrer l'application - [ ] Tester l'authentification - [ ] VĂ©rifier les logs (plus d'erreur) - [ ] VĂ©rifier que les rĂŽles sont correctement extraits --- ## 🔐 SÉCURITÉ **⚠ IMPORTANT :** Actuellement, la vĂ©rification du token est **dĂ©sactivĂ©e** pour contourner ce problĂšme. Cela rĂ©duit la sĂ©curitĂ© car : - Les tokens invalides peuvent ĂȘtre acceptĂ©s - La validation de la signature est contournĂ©e - Les tokens expirĂ©s peuvent ĂȘtre acceptĂ©s **Une fois le mapper corrigĂ©, il est CRITIQUE de rĂ©activer la vĂ©rification.** --- ## 🆘 DÉPANNAGE ### Le problĂšme persiste aprĂšs correction 1. **VĂ©rifier que le mapper a bien Ă©tĂ© supprimĂ©** - Recharger la page des mappers - VĂ©rifier qu'il n'y a qu'un seul mapper pour `realm_access` 2. **VĂ©rifier le token JWT** - DĂ©coder sur jwt.io - VĂ©rifier qu'il n'y a qu'un seul `realm_access` 3. **Vider le cache Keycloak** - RedĂ©marrer Keycloak si possible - Ou attendre quelques minutes pour le cache 4. **VĂ©rifier les logs Keycloak** - Chercher des erreurs de gĂ©nĂ©ration de token ### Comment identifier le bon mapper **Mapper CORRECT :** - Token Claim Name : `realm_access.roles` (avec `.roles`) - Type : `User Realm Role` - CrĂ©e un objet : `{"realm_access": {"roles": [...]}}` **Mapper INCORRECT :** - Token Claim Name : `realm_access` (sans `.roles`) - Type : Peut ĂȘtre `User Realm Role` ou autre - CrĂ©e un tableau : `{"realm_access": [...]}` --- **Date de crĂ©ation :** 17 novembre 2025 **PrioritĂ© :** 🔮 CRITIQUE - À corriger avant production