# Corrections OIDC pour BTPXpress Client JSF - CONFIGURATION FINALE ## ✅ Configuration Keycloak vérifiée Le client `btpxpress-frontend` est **correctement configuré**: - ✅ Type: **Confidential Client** (converti depuis Public pour plus de sécurité) - ✅ Standard Flow: Activé - ✅ PKCE: S256 (activé même pour client confidential - défense en profondeur) - ✅ Redirect URIs incluent: `http://localhost:8081/*` - ✅ Implicit Flow: Désactivé (sécurité) - ✅ Client Secret: `0Ph4e31lQQuonodmLQG3JycehbFL1Hei` ## ✅ Corrections appliquées dans application.properties ### 1. Configuration OIDC pour client confidential ```properties # Client confidential avec secret (récupéré depuis Keycloak) quarkus.oidc.credentials.secret=0Ph4e31lQQuonodmLQG3JycehbFL1Hei # PKCE recommandé même pour client confidential quarkus.oidc.authentication.pkce-required=true # pkce-secret=false car on utilise un state-secret dédié (pas le client secret) quarkus.oidc.authentication.pkce-secret=false # State secret OBLIGATOIRE pour PKCE (32 caractères) quarkus.oidc.authentication.state-secret=btpxpress-pkce-state-secret-32ch ``` ### 2. Configuration de redirection ```properties # Redirection après authentification quarkus.oidc.authentication.redirect-path=/dashboard.xhtml quarkus.oidc.authentication.restore-path-after-redirect=true quarkus.oidc.authentication.java-script-auto-redirect=false quarkus.oidc.authentication.force-redirect-https-scheme=false ``` ### 3. Logging OIDC pour debugging ```properties quarkus.log.category."io.quarkus.oidc".level=DEBUG quarkus.log.category."io.quarkus.security".level=DEBUG ``` ### 4. Permissions HTTP corrigées - CONFIGURATION FINALE ```properties # Ressources publiques (ordre important - du plus spécifique au plus général) # 1. Ressources statiques JSF et layout quarkus.http.auth.permission.static.paths=/resources/*,/jakarta.faces.resource/*,/layout/*,/demo/*,/theme/* quarkus.http.auth.permission.static.policy=permit # 2. Pages d'erreur seulement (pas d'index ni login) quarkus.http.auth.permission.public-pages.paths=/error.xhtml,/access-denied.xhtml quarkus.http.auth.permission.public-pages.policy=permit # 3. Toutes les autres pages nécessitent une authentification (y compris / et /index.xhtml) quarkus.http.auth.permission.authenticated.paths=/* quarkus.http.auth.permission.authenticated.policy=authenticated ``` ### 5. Encryption des cookies de session ```properties # Token state manager avec encryption quarkus.oidc.token-state-manager.split-tokens=true quarkus.oidc.token-state-manager.strategy=id-refresh-tokens quarkus.oidc.token-state-manager.encryption-secret=btpxpress-secure-cookie-encryption-key-32chars-2025 quarkus.oidc.token-state-manager.encryption-required=false quarkus.oidc.token-state-manager.cookie-max-size=8192 ``` ### 6. Suppression de index.xhtml **IMPORTANT**: Le fichier `index.xhtml` a été supprimé pour permettre au flux OIDC de fonctionner correctement. **Raison**: index.xhtml faisait une redirection HTML côté client vers dashboard.xhtml, ce qui contournait l'authentification OIDC. En supprimant ce fichier, lorsque l'utilisateur accède à `/`, OIDC intercepte la requête et redirige vers Keycloak pour l'authentification. ## ✅ Problèmes résolus ### Problème 1: Secret key encryption trop court **Erreur**: "Secret key for encrypting state cookie is less than 16 characters long" **Solution appliquée**: 1. Ajout du vrai client secret récupéré depuis Keycloak: `0Ph4e31lQQuonodmLQG3JycehbFL1Hei` 2. Ajout d'une clé d'encryption de 32 caractères pour les cookies de session 3. Conversion du client de PUBLIC à CONFIDENTIAL ### Problème 2: Flux OIDC ne se déclenche pas **Symptôme**: L'utilisateur tape `http://localhost:8081` mais n'est pas redirigé vers Keycloak **Cause**: 1. Le fichier `index.xhtml` faisait une redirection HTML côté client vers dashboard.xhtml 2. `/` et `/index.xhtml` étaient dans les pages publiques, donc OIDC ne les interceptait pas **Solution appliquée**: 1. Suppression du fichier `index.xhtml` 2. Retrait de `/` et `/index.xhtml` des pages publiques dans application.properties 3. Maintenant OIDC intercepte toutes les requêtes vers `/` et redirige vers Keycloak ## 🧪 Tests à effectuer ### Test 1: Logs de démarrage Lors du démarrage de l'application, vérifier les logs: ```bash mvn quarkus:dev ``` Vous devriez voir: ``` INFO [io.quarkus.oidc] OIDC enabled DEBUG [io.quarkus.oidc] Discovered OIDC endpoints from https://security.lions.dev/realms/btpxpress/.well-known/openid-configuration ``` ### Test 2: Accès à l'application 1. Ouvrir: `http://localhost:8081` 2. Vous devriez être redirigé vers Keycloak 3. Se connecter avec un utilisateur existant: - `admin@btpxpress.dev` - `directeur@btpxpress.dev` - `chef@btpxpress.dev` - `client@entreprise.com` ### Test 3: Analyser les logs lors de la connexion Lors de la redirection depuis Keycloak, regarder les logs DEBUG: **Succès attendu**: ``` DEBUG [io.quarkus.oidc.runtime.CodeAuthenticationMechanism] Authorization code flow has completed successfully DEBUG [io.quarkus.oidc.runtime.CodeAuthenticationMechanism] ID token verification has succeeded ``` **Échec actuel**: ``` ERROR [io.quarkus.oidc.runtime.CodeAuthenticationMechanism] Authentication has failed ``` ### Test 4: Vérifier l'URL de callback Lors de la redirection depuis Keycloak vers l'application, l'URL devrait ressembler à: ``` http://localhost:8081/dashboard.xhtml?code=XXXXX&state=XXXXX ``` Si l'URL est différente, cela peut indiquer un problème de configuration. ## 🔧 Debugging avancé Si le problème persiste, activer plus de logs: ```properties # Dans application.properties quarkus.log.category."io.vertx.ext.web.handler".level=DEBUG quarkus.log.category."io.quarkus.vertx.http.runtime.security".level=DEBUG ``` ## 📋 Checklist de vérification - COMPLÈTE - [x] Client Keycloak configuré comme **confidential** avec secret - [x] PKCE S256 activé - [x] Redirect URIs incluent http://localhost:8081/* - [x] application.properties configuré avec le vrai client secret - [x] Encryption secret ajouté pour les cookies de session (32 caractères) - [x] Permissions HTTP corrigées: seules les ressources statiques et pages d'erreur sont publiques - [x] index.xhtml supprimé pour permettre à OIDC d'intercepter `/` - [x] Logging OIDC activé pour debugging - [x] Utilisateur de test supprimé (utilisateurs existants utilisés) - [x] Configuration Keycloak mise à jour avec script PowerShell ## 🎯 Flux OIDC attendu Maintenant que toute la configuration est en place, voici le flux attendu: 1. **Utilisateur accède à** `http://localhost:8081` 2. **OIDC intercepte** la requête (car `/` nécessite authentification) 3. **Redirection vers Keycloak** `https://security.lions.dev/realms/btpxpress/protocol/openid-connect/auth?...` 4. **Utilisateur se connecte** avec un des comptes existants 5. **Keycloak redirige vers** `http://localhost:8081/dashboard.xhtml?code=...&state=...` 6. **Application valide le code** auprès de Keycloak 7. **Session créée** avec cookie sécurisé 8. **Dashboard affiché** - utilisateur authentifié ## 🎯 Test à effectuer 1. **Redémarrer l'application**: `mvn quarkus:dev` 2. **Vider le cache du navigateur** (important!) 3. **Accéder à** `http://localhost:8081` 4. **Vérifier la redirection** vers security.lions.dev 5. **Se connecter** avec un utilisateur existant 6. **Vérifier la redirection** vers le dashboard ## 👥 Utilisateurs disponibles - admin@btpxpress.dev - directeur@btpxpress.dev - chef@btpxpress.dev - client@entreprise.com (Utilisez le mot de passe que vous avez défini lors de leur création dans Keycloak)