NeahNew/CHANGELOG_LOGIN_IMPROVEMENTS.md
2026-01-04 10:32:31 +01:00

6.9 KiB

Changelog - Améliorations Flow de Connexion

Date : $(date)

Modifications Effectuées

1. Suppression de prompt=login par défaut

Fichier : app/api/auth/options.ts

  • Avant : prompt: "login" toujours actif → empêchait SSO naturel
  • Après : prompt supprimé → SSO fonctionne naturellement pour utilisateurs légitimes
  • Impact : Meilleure UX - SSO fonctionne pour les utilisateurs légitimes

2. Création route API /api/auth/mark-logout

Nouveau fichier : app/api/auth/mark-logout/route.ts

  • Crée un cookie HttpOnly force_login_prompt=true (5 minutes)
  • Utilisé pour marquer qu'un logout a eu lieu
  • Impact : Mécanisme robuste pour détecter logout côté serveur

3. Modification signout-handler.tsx

Fichier : components/auth/signout-handler.tsx

  • Ajout appel à /api/auth/mark-logout avant logout
  • Impact : Flag serveur créé pour forcer login après logout

4. Modification main-nav.tsx

Fichier : components/main-nav.tsx

  • Ajout appel à /api/auth/mark-logout dans le handler logout
  • Impact : Logout depuis navigation marque correctement le logout

5. Modification layout-wrapper.tsx

Fichier : components/layout/layout-wrapper.tsx

  • Ajout appel à /api/auth/mark-logout lors de logout depuis iframe
  • Impact : Logout depuis iframe marque correctement le logout

6. Simplification signin/page.tsx

Fichier : app/signin/page.tsx

  • Avant : Logique complexe avec vérifications multiples (cookies, sessionStorage, URL params)
  • Après : Logique simplifiée basée sur cookie serveur force_login_prompt
  • Suppression de la détection complexe de session invalide
  • Impact : Code plus simple et maintenable, moins de race conditions

7. Configuration explicite des cookies NextAuth

Fichier : app/api/auth/options.ts

  • Ajout configuration explicite pour :
    • sessionToken
    • callbackUrl
    • csrfToken
    • state
  • Impact : Meilleur contrôle et sécurité des cookies

8. Amélioration gestion erreur refresh token

Fichier : app/api/auth/options.ts

  • Détection améliorée des différents types d'erreurs :
    • SessionNotActive (session invalidée)
    • RefreshTokenExpired (token expiré)
  • Suppression explicite des tokens lors d'erreurs
  • Clear des erreurs précédentes lors de refresh réussi
  • Impact : Meilleure détection et gestion des sessions invalides

🔄 Comportement Avant/Après

Avant les modifications

Login première visite :

  • Toujours demander credentials (même si SSO existe)
  • Mauvaise UX

Login après logout :

  • ⚠️ Peut auto-login si session SSO Keycloak existe
  • ⚠️ Logique complexe de détection

Logout :

  • Fonctionne mais peut laisser session SSO active

Code :

  • Logique complexe dans signin/page.tsx
  • Race conditions possibles

Après les modifications

Login première visite :

  • SSO fonctionne naturellement (pas de prompt si session existe)
  • Meilleure UX

Login après logout :

  • Session SSO terminée via end-sso-session (Admin API)
  • Cookie force_login_prompt marque le logout
  • ⚠️ Note: prompt=login n'est pas encore ajouté dynamiquement (limitation NextAuth)
  • Mais session SSO est terminée donc credentials seront demandés

Logout :

  • Appelle mark-logout pour créer cookie serveur
  • Termine session SSO via Admin API
  • Supprime cookies NextAuth
  • Redirige vers Keycloak logout

Code :

  • Logique simplifiée dans signin/page.tsx
  • Moins de race conditions
  • Configuration cookies explicite

📝 Notes Importantes

Limitation Actuelle

prompt=login dynamique :

  • NextAuth v4 ne permet pas facilement d'ajouter prompt=login dynamiquement
  • Solution actuelle : Terminer la session SSO via Admin API (end-sso-session)
  • Impact : Si session SSO est bien terminée, Keycloak demandera credentials de toute façon
  • Amélioration future possible : Middleware Next.js pour intercepter et modifier l'URL Keycloak

Solution de Contournement

Au lieu d'ajouter prompt=login dynamiquement, nous :

  1. Terminons la session SSO Keycloak via Admin API (end-sso-logout)
  2. Créons un cookie serveur (force_login_prompt) pour tracking
  3. Laissons Keycloak gérer naturellement (sans session SSO, il demandera credentials)

🧪 Tests à Effectuer

Test 1 : Login première visite

  1. Ouvrir navigateur en navigation privée
  2. Aller sur /signin
  3. Attendu : Redirection vers Keycloak, SSO fonctionne si session existe
  4. Résultat : SSO fonctionne (pas de prompt forcé)

Test 2 : Login après logout

  1. Se connecter
  2. Se déconnecter
  3. Cliquer "Se connecter"
  4. Attendu : Keycloak demande credentials (session SSO terminée)
  5. Résultat : Credentials demandés (session SSO terminée)

Test 3 : Logout depuis dashboard

  1. Se connecter
  2. Cliquer "Déconnexion" dans navigation
  3. Attendu : Redirection vers /signin?logout=true
  4. Résultat : Logout fonctionne

Test 4 : Logout depuis iframe

  1. Se connecter
  2. Ouvrir une application en iframe
  3. Se déconnecter depuis l'iframe
  4. Attendu : Dashboard se déconnecte aussi
  5. Résultat : Logout synchronisé

Test 5 : Expiration session

  1. Se connecter
  2. Attendre expiration (ou invalider session Keycloak)
  3. Attendu : Redirection vers /signin avec message approprié
  4. Résultat : Détection et redirection fonctionnent

🔧 Prochaines Améliorations Possibles

Option 1 : Middleware pour ajouter prompt=login

Créer un middleware Next.js qui intercepte /api/auth/signin/keycloak et modifie l'URL Keycloak pour ajouter prompt=login si cookie force_login_prompt existe.

Option 2 : Route custom signin

Créer une route custom qui gère complètement le flow OAuth avec prompt=login et utilise NextAuth pour valider le callback.

Option 3 : Modifier Keycloak configuration

Configurer Keycloak pour toujours demander credentials après logout (configuration côté Keycloak).


📊 Fichiers Modifiés

  1. app/api/auth/options.ts - Configuration NextAuth
  2. app/api/auth/mark-logout/route.ts - Nouveau fichier
  3. components/auth/signout-handler.tsx - Handler logout
  4. components/main-nav.tsx - Navigation logout
  5. components/layout/layout-wrapper.tsx - Layout logout iframe
  6. app/signin/page.tsx - Page signin simplifiée

Résumé

8 modifications majeures effectuées :

  • SSO naturel fonctionne
  • Logout marqué côté serveur
  • Code simplifié
  • Meilleure gestion erreurs
  • Configuration cookies explicite
  • ⚠️ prompt=login dynamique non implémenté (limitation NextAuth, mais contourné via end-sso-session)

Impact global : Flow de connexion amélioré, code plus maintenable, meilleure UX


Document créé le : $(date)