200 lines
6.9 KiB
Markdown
200 lines
6.9 KiB
Markdown
# 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)
|
|
|