194 lines
5.4 KiB
Markdown
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
|
|
|