- Mise à jour de services/api.ts pour supporter l'authentification par cookies HttpOnly
* Ajout de withCredentials: true dans l'intercepteur de requêtes
* Modification de l'intercepteur de réponse pour gérer les 401 sans localStorage
* Utilisation de sessionStorage pour returnUrl au lieu de localStorage
* Suppression des tentatives de nettoyage de tokens localStorage (gérés par cookies)
- Connexion des pages de détails à apiService au lieu de fetch direct:
* app/(main)/chantiers/[id]/page.tsx → apiService.chantiers.getById()
* app/(main)/chantiers/[id]/budget/page.tsx → apiService.budgets.getByChantier()
* app/(main)/clients/[id]/page.tsx → apiService.clients.getById()
* app/(main)/materiels/[id]/page.tsx → apiService.materiels.getById()
Avantages:
- Gestion automatique de l'authentification via cookies HttpOnly (plus sécurisé)
- Redirection automatique vers /api/auth/login en cas de 401
- Code plus propre et maintenable
- Gestion d'erreurs cohérente dans toute l'application
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
PHASE 1 - CORRECTIONS CRITIQUES TERMINÉES
✅ API Routes Auth créées:
- /api/auth/login: Initie le flux OAuth avec Keycloak
- /api/auth/token: Échange le code OAuth contre des tokens
- /api/auth/logout: Déconnexion et nettoyage des tokens
- /api/auth/userinfo: Récupère les informations utilisateur
✅ Middleware d'authentification:
- Protection des routes privées
- Vérification de l'access_token dans les cookies HttpOnly
- Vérification de l'expiration des tokens
- Redirection automatique vers /auth/login si non authentifié
- Routes publiques configurées (/auth/*, /api/health, /)
✅ Page de login:
- Interface moderne avec PrimeReact
- Redirection vers Keycloak OAuth
- Gestion du returnUrl pour revenir à la page demandée
✅ Sécurité:
- Tokens stockés dans cookies HttpOnly (pas localStorage)
- Protection CSRF avec state parameter
- Validation de l'expiration des tokens
- Nettoyage automatique des cookies expirés
✅ Callback OAuth:
- Protection contre les appels multiples (useRef)
- Gestion d'erreurs robuste
- Nettoyage de l'URL après échange
- Suspense boundary pour le chargement
Cette implémentation résout les problèmes critiques:
- Boucle OAuth infinie (code réutilisé)
- Absence d'API route token exchange
- Middleware non fonctionnel
- Pas de page de login
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
The @fullcalendar/core package was pinned to exact version 6.1.4 while
other @fullcalendar packages used ^6.1.4, causing npm to install newer
versions (6.1.19) that required core@~6.1.19.
This change adds the ^ prefix to @fullcalendar/core version to allow
minor version updates and resolve the ERESOLVE conflict.
Fixes deployment error: ERESOLVE could not resolve peer dependency
PROBLÈME RÉSOLU:
- Erreur "Code already used" répétée dans les logs Keycloak
- Boucle infinie de tentatives d'échange du code d'autorisation OAuth
- Utilisateurs bloqués à la connexion
CORRECTIONS APPLIQUÉES:
1. Ajout de useRef pour protéger contre les exécutions multiples
- hasExchanged.current: Flag pour prévenir les réexécutions
- isProcessing.current: Protection pendant le traitement
2. Modification des dépendances useEffect
- AVANT: [searchParams, router] → exécution à chaque changement
- APRÈS: [] → exécution unique au montage du composant
3. Amélioration du logging
- Console logs pour debug OAuth flow
- Messages emoji pour faciliter le suivi
4. Nettoyage de l'URL
- window.history.replaceState() pour retirer les paramètres OAuth
- Évite les re-renders causés par les paramètres dans l'URL
5. Gestion d'erreurs améliorée
- Capture des erreurs JSON du serveur
- Messages d'erreur plus explicites
FICHIERS AJOUTÉS:
- app/(main)/aide/* - 4 pages du module Aide (documentation, tutoriels, support)
- app/(main)/messages/* - 4 pages du module Messages (inbox, envoyés, archives)
- app/auth/callback/page.tsx.backup - Sauvegarde avant modification
IMPACT:
✅ Un seul échange de code par authentification
✅ Plus d'erreur "Code already used"
✅ Connexion fluide et sans boucle
✅ Logs propres et lisibles
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Problem: Frontend was trying to contact http://localhost:8080 instead of
https://api.lions.dev/btpxpress because NEXT_PUBLIC_API_URL wasn't correctly
baked into the Next.js bundle during build.
Solution:
- Added ARG declarations with correct default values for all NEXT_PUBLIC_* variables
- Convert ARG to ENV before running npm run build
- This ensures Next.js bakes the correct values into the bundle
- ARG allows override at docker build time if needed
- Fixed ENV format to use = instead of space (removes Docker warnings)
Variables defined:
- NEXT_PUBLIC_API_URL=https://api.lions.dev/btpxpress
- NEXT_PUBLIC_KEYCLOAK_URL=https://security.lions.dev
- NEXT_PUBLIC_KEYCLOAK_REALM=btpxpress
- NEXT_PUBLIC_KEYCLOAK_CLIENT_ID=btpxpress-frontend
- NEXT_PUBLIC_APP_ENV=production
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added explicit ENV declarations for all NEXT_PUBLIC_* variables in the
builder stage before npm run build. This ensures Next.js correctly bakes
these values into the JavaScript bundle, regardless of lionsctl's
automatic manifest generation.
Variables defined:
- NEXT_PUBLIC_API_URL=https://api.lions.dev/btpxpress
- NEXT_PUBLIC_KEYCLOAK_URL=https://security.lions.dev
- NEXT_PUBLIC_KEYCLOAK_REALM=btpxpress
- NEXT_PUBLIC_KEYCLOAK_CLIENT_ID=btpxpress-frontend
- NEXT_PUBLIC_APP_ENV=production
This fixes the issue where the frontend was using https://api.lions.dev
instead of https://api.lions.dev/btpxpress for API calls.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Ajoute !.env.production au .gitignore pour permettre au fichier d'être versionné.
Cela permet au build Docker de copier .env.production et de le charger avec ENV NODE_ENV production.
Fixes the issue where NEXT_PUBLIC_API_URL was not set correctly in production builds.
Next.js only loads .env.production when NODE_ENV=production is set during build time.
Previously, NODE_ENV was only set in the runner stage, causing the builder stage to
ignore .env.production and use default values.
This fixes NEXT_PUBLIC_API_URL to correctly point to https://api.lions.dev/btpxpress
instead of just https://api.lions.dev.
The frontend now correctly points to https://api.lions.dev/btpxpress
instead of just https://api.lions.dev, which fixes the communication
issue between frontend and backend.
This file is needed at build-time because Next.js bakes NEXT_PUBLIC_*
variables into the bundle during the build process.
Fixes:
- Frontend can now call backend API endpoints correctly
- Resolves 404 errors when making API requests
- Works with Ingress rewrite-target configuration
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Suppression du stockage localStorage dans /auth/callback
- Utilisation de window.location.href pour la redirection
- Les tokens sont maintenant gérés uniquement par les cookies HttpOnly
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Stockage des tokens dans des cookies HttpOnly côté serveur
- Suppression du stockage localStorage côté client
- Modification du middleware pour vérifier les cookies HttpOnly
- Redirection propre après authentification
- Suppression du nettoyage précoce des paramètres URL
Cela corrige le problème où le dashboard se rafraîchissait en boucle
après l'authentification Keycloak.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Correction des erreurs TypeScript dans userService.ts et workflowTester.ts
- Ajout des propriétés manquantes aux objets User mockés
- Conversion des dates de string vers objets Date
- Correction des appels asynchrones et des types incompatibles
- Ajout de dynamic rendering pour résoudre les erreurs useSearchParams
- Enveloppement de useSearchParams dans Suspense boundary
- Configuration de force-dynamic au niveau du layout principal
Build réussi: 126 pages générées avec succès
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>