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.
5.8 KiB
5.8 KiB
Configuration des Secrets OIDC - BTPXpress Client JSF
✅ Solution définitive au problème "Secret key for encrypting state cookie is less than 16 characters long"
Problème identifié
Quarkus OIDC nécessite TROIS secrets différents pour fonctionner correctement avec PKCE et client confidential:
- Client Secret - Pour l'authentification auprès de Keycloak
- State Secret - Pour encrypter le PKCE code verifier dans le state cookie
- Token Encryption Secret - Pour encrypter les tokens dans les cookies de session
❌ Erreur rencontrée
io.quarkus.runtime.configuration.ConfigurationException:
Secret key for encrypting state cookie is less than 16 characters long
🔍 Cause racine
Quand quarkus.oidc.authentication.pkce-required=true est activé, Quarkus a besoin d'un state-secret de 32 caractères pour encrypter le PKCE code verifier dans le state cookie.
Ce secret est:
- Auto-généré si le client secret fait au moins 32 caractères ET n'est pas explicitement configuré
- OBLIGATOIRE à configurer explicitement si le fallback au client secret ne fonctionne pas
✅ Configuration finale dans application.properties
# 1. Client Secret (32 caractères) - Récupéré depuis Keycloak
quarkus.oidc.credentials.secret=0Ph4e31lQQuonodmLQG3JycehbFL1Hei
# 2. PKCE avec State Secret (32 caractères) - OBLIGATOIRE
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
quarkus.oidc.authentication.state-secret=btpxpress-pkce-state-secret-32ch
# 3. Token Encryption Secret (32+ caractères) - Pour les cookies de session
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
📊 Tableau récapitulatif des secrets
| Secret | Propriété | Longueur | Valeur | Usage |
|---|---|---|---|---|
| Client Secret | quarkus.oidc.credentials.secret |
32 chars | 0Ph4e31lQQuonodmLQG3JycehbFL1Hei |
Authentification avec Keycloak |
| State Secret | quarkus.oidc.authentication.state-secret |
32 chars | btpxpress-pkce-state-secret-32c |
Encryption PKCE code verifier |
| Token Encryption | quarkus.oidc.token-state-manager.encryption-secret |
32+ chars | btpxpress-secure-cookie-encryption-key-32chars-2025 |
Encryption tokens dans cookies |
🎯 Pourquoi ces 3 secrets?
1. Client Secret (credentials.secret)
- Rôle: Authentifie l'application auprès de Keycloak lors de l'échange du code d'autorisation
- Requis pour: Client confidential (non public)
- Source: Généré par Keycloak et récupéré via script
get-client-secret.ps1
2. State Secret (authentication.state-secret)
- Rôle: Encrypte le PKCE code verifier stocké dans le state cookie pendant la redirection OIDC
- Requis pour: PKCE (
pkce-required=true) - Important: Si
state-secretest défini, il faut mettrepkce-secret=false. Sipkce-secret=true, le client secret est utilisé et state-secret ne doit PAS être configuré - Documentation: Quarkus OIDC Code Flow Authentication
3. Token Encryption Secret (token-state-manager.encryption-secret)
- Rôle: Encrypte les tokens ID, access et refresh stockés dans les cookies de session
- Requis pour: Déploiements multi-pods ou quand la taille des cookies dépasse 4096 bytes
- Documentation: Quarkus OIDC Expanded Configuration
🔐 Sécurité en production
⚠️ IMPORTANT: Ne jamais commiter les secrets en production!
Pour la production, utilisez des variables d'environnement:
# production-application.properties
quarkus.oidc.credentials.secret=${KEYCLOAK_CLIENT_SECRET}
quarkus.oidc.authentication.state-secret=${OIDC_STATE_SECRET}
quarkus.oidc.token-state-manager.encryption-secret=${OIDC_TOKEN_ENCRYPTION_SECRET}
Génération de secrets sécurisés
# Linux/Mac
openssl rand -base64 32
# PowerShell
-join ((65..90) + (97..122) + (48..57) | Get-Random -Count 32 | ForEach-Object {[char]$_})
# Python
python -c "import secrets; print(secrets.token_urlsafe(32)[:32])"
📚 Références officielles
- GitHub Issue #33532: Clarify startup warning: Secret key for encrypting
- Quarkus Guide: OpenID Connect authorization code flow
- Red Hat Documentation: OpenID Connect (OIDC) authentication - Quarkus 3.15
✅ Vérification de la configuration
Pour vérifier que tous les secrets sont correctement configurés:
# Démarrer l'application
mvn quarkus:dev
# Vérifier les logs - vous devriez voir:
# ✓ OIDC enabled
# ✓ Discovered OIDC endpoints from https://security.lions.dev/realms/btpxpress/.well-known/openid-configuration
# ✓ Aucune erreur "Secret key for encrypting state cookie"
🧪 Test du flux OIDC
- Accéder à
http://localhost:8081 - → Redirection automatique vers
https://security.lions.dev - → Connexion avec utilisateur existant (admin@btpxpress.dev, etc.)
- → Validation PKCE code verifier (encrypté avec state-secret)
- → Échange authorization code contre tokens (avec client secret)
- → Stockage tokens dans cookies (encryptés avec token-encryption-secret)
- → Redirection vers
/dashboard.xhtml✅
Date de résolution: 2025-11-07 Version Quarkus: 3.15.1 Configuration testée et validée: ✅