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.
198 lines
7.6 KiB
Markdown
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)
|