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

198 lines
7.6 KiB
Markdown

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