Création de 2 écrans professionnels pour le module Devis:
1. devis/nouveau.xhtml:
- 4 sections: Informations générales, Détail du devis, Montants, Conditions
- Numéro auto-généré avec icône
- Statut avec 5 valeurs (BROUILLON, ATTENTE, ACCEPTE, REFUSE, EXPIRE)
- Dates d'émission et validité avec calendriers
- Client et objet du devis requis
- Placeholder pour lignes de devis (future développement)
- Calcul automatique TVA 18% et TTC
- Récapitulatif visuel HT/TVA/TTC avec composant monétaire
- Conditions de paiement et remarques (section collapsible)
- 3 boutons: Annuler, Brouillon, Envoyer
2. devis/details.xhtml:
- En-tête: numéro, statut, client, objet, dates
- Actions: Retour, Convertir en chantier, PDF, Modifier
- 4 KPI cards: Montant HT, TVA, TTC, Statut
- 6 onglets professionnels:
* Vue d'ensemble: infos + récap financier + actions rapides
* Détail des lignes: table lignes (placeholder)
* Conditions: paiement, délais, garanties
* Documents: GED associée (placeholder)
* Suivi: timeline actions
* Historique: modifications (placeholder)
Corrections:
- Fix navigation /factures/nouvelle -> /factures/nouveau (factures.xhtml)
- Fix menu /factures/nouvelle -> /factures/nouveau (menu.xhtml)
Tous les composants réutilisables utilisés (status-badge, monetary-display).
Validation complète côté client et serveur.
UI/UX professionnel adapté au métier BTP.
7.6 KiB
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
# 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
# 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
quarkus.log.category."io.quarkus.oidc".level=DEBUG
quarkus.log.category."io.quarkus.security".level=DEBUG
4. Permissions HTTP corrigées - CONFIGURATION FINALE
# 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
# 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:
- Ajout du vrai client secret récupéré depuis Keycloak:
0Ph4e31lQQuonodmLQG3JycehbFL1Hei - Ajout d'une clé d'encryption de 32 caractères pour les cookies de session
- 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:
- Le fichier
index.xhtmlfaisait une redirection HTML côté client vers dashboard.xhtml /et/index.xhtmlétaient dans les pages publiques, donc OIDC ne les interceptait pas
Solution appliquée:
- Suppression du fichier
index.xhtml - Retrait de
/et/index.xhtmldes pages publiques dans application.properties - 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:
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
- Ouvrir:
http://localhost:8081 - Vous devriez être redirigé vers Keycloak
- Se connecter avec un utilisateur existant:
admin@btpxpress.devdirecteur@btpxpress.devchef@btpxpress.devclient@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:
# 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
- Client Keycloak configuré comme confidential avec secret
- PKCE S256 activé
- Redirect URIs incluent http://localhost:8081/*
- application.properties configuré avec le vrai client secret
- Encryption secret ajouté pour les cookies de session (32 caractères)
- Permissions HTTP corrigées: seules les ressources statiques et pages d'erreur sont publiques
- index.xhtml supprimé pour permettre à OIDC d'intercepter
/ - Logging OIDC activé pour debugging
- Utilisateur de test supprimé (utilisateurs existants utilisés)
- Configuration Keycloak mise à jour avec script PowerShell
🎯 Flux OIDC attendu
Maintenant que toute la configuration est en place, voici le flux attendu:
- Utilisateur accède à
http://localhost:8081 - OIDC intercepte la requête (car
/nécessite authentification) - Redirection vers Keycloak
https://security.lions.dev/realms/btpxpress/protocol/openid-connect/auth?... - Utilisateur se connecte avec un des comptes existants
- Keycloak redirige vers
http://localhost:8081/dashboard.xhtml?code=...&state=... - Application valide le code auprès de Keycloak
- Session créée avec cookie sécurisé
- Dashboard affiché - utilisateur authentifié
🎯 Test à effectuer
- Redémarrer l'application:
mvn quarkus:dev - Vider le cache du navigateur (important!)
- Accéder à
http://localhost:8081 - Vérifier la redirection vers security.lions.dev
- Se connecter avec un utilisateur existant
- Vérifier la redirection vers le dashboard
👥 Utilisateurs disponibles
(Utilisez le mot de passe que vous avez défini lors de leur création dans Keycloak)