Files
btpxpress-frontend/CORRECTIONS_OIDC.md
dahoud ec38f6a23a feat: Module Devis professionnel avec écrans complets
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.
2025-11-08 10:49:19 +00:00

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:

  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:

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:

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

  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

(Utilisez le mot de passe que vous avez défini lors de leur création dans Keycloak)