Files
unionflow-client-quarkus-pr…/CORRECTION_KEYCLOAK_MAPPER.md
2025-11-17 16:02:04 +00:00

194 lines
5.4 KiB
Markdown

# 🔧 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