# Audit Complet des Fichiers Login/Logout - Analyse des Cookies ## 📋 Vue d'ensemble Ce document liste **TOUS** les fichiers de code impliquĂ©s dans le processus de **login** et **logout** du dashboard Next.js avec NextAuth et Keycloak, avec une analyse approfondie de la gestion des cookies. --- ## 🔐 FICHIERS CORE - Configuration NextAuth ### 1. **`app/api/auth/[...nextauth]/route.ts`** **RĂŽle** : Route handler NextAuth pour tous les endpoints d'authentification **Cookies gĂ©rĂ©s** : - `next-auth.session-token` (ou variantes sĂ©curisĂ©es) - Cookie principal de session NextAuth - `next-auth.csrf-token` - Token CSRF pour la sĂ©curitĂ© - `next-auth.state` - État OAuth pour le flow Keycloak - `next-auth.callback-url` - URL de callback aprĂšs authentification **Fonctions** : - GĂšre `GET/POST /api/auth/signin` → Redirige vers Keycloak - GĂšre `GET/POST /api/auth/signout` → DĂ©connecte et nettoie les cookies - GĂšre `GET /api/auth/session` → Lit le cookie de session - GĂšre `GET /api/auth/callback/keycloak` → Reçoit le code OAuth de Keycloak - GĂšre `GET /api/auth/csrf` → GĂ©nĂšre le token CSRF - GĂšre `GET /api/auth/providers` → Liste les providers disponibles **Cookies créés/supprimĂ©s** : - **Login** : CrĂ©e `next-auth.session-token` (HttpOnly, Secure, SameSite=Lax) - **Logout** : Supprime `next-auth.session-token` via `signOut()` --- ### 2. **`app/api/auth/options.ts`** ⭐ **FICHIER CRITIQUE** **RĂŽle** : Configuration principale de NextAuth avec Keycloak **Cookies gĂ©rĂ©s** : - Tous les cookies NextAuth (via configuration implicite) - Les tokens Keycloak sont stockĂ©s dans le JWT (pas de cookies sĂ©parĂ©s) **Fonctions clĂ©s** : #### `refreshAccessToken(token)` (lignes 83-139) - **Cookies utilisĂ©s** : Aucun directement, mais utilise `refreshToken` du JWT - **Comportement** : - Appelle Keycloak `/token` endpoint pour rafraĂźchir - DĂ©tecte si la session Keycloak est invalide (erreur `invalid_grant`) - Retourne `error: "SessionNotActive"` si session Keycloak expirĂ©e #### `jwt` callback (lignes 196-282) - **Cookies utilisĂ©s** : Lit `next-auth.session-token` (dĂ©cryptĂ© par NextAuth) - **Comportement** : - **Initial login** : Stocke `accessToken`, `refreshToken`, `idToken` dans le JWT - **Subsequent requests** : VĂ©rifie expiration, rafraĂźchit si nĂ©cessaire - **Token expired** : Appelle `refreshAccessToken()` - **Session invalidated** : Retourne token avec `error: "SessionNotActive"` #### `session` callback (lignes 283-324) - **Cookies utilisĂ©s** : Lit le JWT depuis `next-auth.session-token` - **Comportement** : - Si `token.error === "SessionNotActive"` → Retourne `null` (force logout) - Sinon, construit la session avec les donnĂ©es utilisateur **Configuration cookies** : ```typescript session: { strategy: "jwt", maxAge: 4 * 60 * 60, // 4 heures } // Les cookies sont gĂ©rĂ©s automatiquement par NextAuth // Pas de configuration explicite des cookies dans ce fichier ``` **ParamĂštres OAuth** : ```typescript authorization: { params: { scope: "openid profile email roles", prompt: "login" // Force le prompt de login mĂȘme si SSO existe } } ``` --- ## đŸšȘ FICHIERS PAGES - Interface Utilisateur ### 3. **`app/signin/page.tsx`** ⭐ **FICHIER CRITIQUE** **RĂŽle** : Page de connexion avec logique complexe de dĂ©tection de logout **Cookies analysĂ©s** : - `next-auth.session-token` (ou variantes) - VĂ©rifie si cookie existe mais invalide - `logout_in_progress` - Cookie temporaire (60s) pour marquer logout en cours - Cookies Keycloak (via `document.cookie`) **Fonctions clĂ©s** : #### DĂ©tection de logout/session invalide (lignes 17-67) ```typescript // VĂ©rifie les cookies NextAuth const hasInvalidSessionCookie = document.cookie .split(';') .some(c => c.trim().startsWith('next-auth.session-token=') || c.trim().startsWith('__Secure-next-auth.session-token=') || c.trim().startsWith('__Host-next-auth.session-token=')); // Si cookie existe mais status = unauthenticated → Session invalidĂ©e if (status === 'unauthenticated' && hasInvalidSessionCookie) { sessionStorage.setItem('session_invalidated', 'true'); // EmpĂȘche auto-login } ``` #### Auto-login (lignes 69-124) - **Condition** : Seulement si **PAS** de cookie de session existant - **Comportement** : Appelle `signIn("keycloak")` aprĂšs 1 seconde - **Protection** : Ne s'exĂ©cute pas si `logout_in_progress` ou `session_invalidated` #### Initialisation storage (lignes 126-158) - Appelle `/api/storage/init` aprĂšs authentification rĂ©ussie - Force reload pour mettre Ă  jour la session **Cookies créés/supprimĂ©s** : - **Aucun cookie créé directement** (NextAuth gĂšre ça) - **Supprime** : `sessionStorage` items (`just_logged_out`, `session_invalidated`) --- ### 4. **`app/signout/page.tsx`** **RĂŽle** : Page de dĂ©connexion (simple wrapper) **Cookies** : Aucune manipulation directe, dĂ©lĂšgue Ă  `SignOutHandler` --- ## 🔧 FICHIERS COMPOSANTS - Logique MĂ©tier ### 5. **`components/auth/signout-handler.tsx`** ⭐ **FICHIER CRITIQUE** **RĂŽle** : GĂšre la dĂ©connexion complĂšte (NextAuth + Keycloak) **Cookies manipulĂ©s** : #### Cookies NextAuth (ligne 23) ```typescript clearAuthCookies(); // Supprime next-auth.session-token ``` #### Cookies Keycloak (ligne 25) ```typescript clearKeycloakCookies(); // Tente de supprimer KEYCLOAK_SESSION, etc. ``` #### Cookie de flag (ligne 16) ```typescript document.cookie = 'logout_in_progress=true; path=/; max-age=60'; ``` **Flow de logout** : 1. Marque logout en cours (`sessionStorage` + cookie) 2. **Supprime cookies NextAuth** (`clearAuthCookies()`) 3. **Tente de supprimer cookies Keycloak** (`clearKeycloakCookies()`) 4. Appelle `/api/auth/end-sso-session` (Admin API Keycloak) 5. Appelle `signOut()` NextAuth (supprime cookie serveur) 6. Redirige vers Keycloak logout endpoint avec `id_token_hint` 7. Keycloak redirige vers `/signin?logout=true` **Cookies supprimĂ©s** : - `next-auth.session-token` (et variantes) - `KEYCLOAK_SESSION`, `KEYCLOAK_IDENTITY`, `AUTH_SESSION_ID` (si mĂȘme domaine) - `logout_in_progress` (expire aprĂšs 60s) --- ### 6. **`components/main-nav.tsx`** (lignes 364-446) **RĂŽle** : Bouton de dĂ©connexion dans la navigation **Cookies** : MĂȘme logique que `signout-handler.tsx` - Appelle `clearAuthCookies()` et `clearKeycloakCookies()` - CrĂ©e cookie `logout_in_progress` - MĂȘme flow que `SignOutHandler` --- ### 7. **`components/layout/layout-wrapper.tsx`** ⭐ **FICHIER CRITIQUE** **RĂŽle** : Écoute les messages de logout depuis les iframes **Cookies manipulĂ©s** : - MĂȘme pattern que `signout-handler.tsx` - GĂšre les logout dĂ©clenchĂ©s par les iframes via `postMessage` **Fonction clĂ©** (lignes 23-112) : ```typescript const handleMessage = async (event: MessageEvent) => { if (event.data.type === 'KEYCLOAK_LOGOUT' || event.data.type === 'LOGOUT') { // MĂȘme flow que signout-handler.tsx clearAuthCookies(); clearKeycloakCookies(); // ... logout complet } }; ``` **Cookies** : Identique Ă  `signout-handler.tsx` --- ### 8. **`components/auth/auth-check.tsx`** **RĂŽle** : Guard d'authentification cĂŽtĂ© client **Cookies** : Aucune manipulation directe - Utilise `useSession()` qui lit `next-auth.session-token` - Redirige vers `/signin` si `status === "unauthenticated"` --- ### 9. **`components/providers.tsx`** **RĂŽle** : Wrapper `SessionProvider` pour NextAuth **Cookies** : Aucune manipulation, fournit le contexte de session --- ## đŸ› ïž FICHIERS UTILITAIRES - Gestion Sessions/Cookies ### 10. **`lib/session.ts`** ⭐ **FICHIER CRITIQUE** **RĂŽle** : Utilitaires pour gĂ©rer les cookies et sessions #### `clearAuthCookies()` (lignes 93-108) **Cookies supprimĂ©s** : ```typescript // Supprime SEULEMENT les cookies de session, PAS les cookies OAuth if (cookieName.startsWith('next-auth.session-token') || cookieName.startsWith('__Secure-next-auth.session-token') || cookieName.startsWith('__Host-next-auth.session-token')) { document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`; } ``` **Important** : Ne supprime **PAS** : - `next-auth.csrf-token` (nĂ©cessaire pour OAuth) - `next-auth.state` (nĂ©cessaire pour OAuth flow) - `next-auth.callback-url` #### `clearKeycloakCookies()` (lignes 115-154) **Cookies Keycloak tentĂ©s de supprimer** : ```typescript const keycloakCookieNames = [ 'KEYCLOAK_SESSION', 'KEYCLOAK_SESSION_LEGACY', 'KEYCLOAK_IDENTITY', 'KEYCLOAK_IDENTITY_LEGACY', 'AUTH_SESSION_ID', 'KC_RESTART', 'KC_RESTART_LEGACY' ]; ``` **Limitation** : Ces cookies sont sur le domaine Keycloak, donc **ne peuvent pas ĂȘtre supprimĂ©s** depuis le domaine du dashboard (mĂȘme origine). Cette fonction tente plusieurs combinaisons domain/path mais Ă©chouera si Keycloak est sur un domaine diffĂ©rent. #### `invalidateServiceTokens()` (lignes 53-91) **Cookies** : Aucun, invalide les tokens de services externes (RocketChat, Leantime) --- ### 11. **`lib/keycloak.ts`** **RĂŽle** : Client Admin Keycloak pour gestion serveur **Cookies** : Aucune manipulation directe - UtilisĂ© par `/api/auth/end-sso-session` pour terminer la session SSO --- ## 🌐 FICHIERS API - Endpoints Serveur ### 12. **`app/api/auth/end-sso-session/route.ts`** ⭐ **FICHIER CRITIQUE** **RĂŽle** : Termine la session SSO Keycloak via Admin API **Cookies** : Aucune manipulation directe - Utilise Keycloak Admin API pour logout utilisateur - **Important** : Termine la session **realm-wide**, pas seulement client **Flow** : 1. Lit `next-auth.session-token` via `getServerSession()` 2. Extrait `idToken` de la session 3. DĂ©code `idToken` pour obtenir `userId` 4. Appelle `adminClient.users.logout({ id: userId })` 5. Keycloak supprime **toutes** les sessions de l'utilisateur **Impact cookies** : - Keycloak supprime ses cookies cĂŽtĂ© serveur - Les cookies Keycloak deviennent invalides (mais restent dans le navigateur jusqu'Ă  expiration) --- ### 13. **`app/api/auth/refresh-keycloak-session/route.ts`** **RĂŽle** : RafraĂźchit la session Keycloak (si existe) **Cookies** : Lit `next-auth.session-token` via `getServerSession()` --- ## 📄 FICHIERS LAYOUT - Structure Application ### 14. **`app/layout.tsx`** **RĂŽle** : Layout racine avec vĂ©rification de session serveur **Cookies** : Lit `next-auth.session-token` via `getServerSession(authOptions)` - Passe `isAuthenticated` Ă  `LayoutWrapper` - DĂ©termine si c'est la page signin --- ### 15. **`app/components/responsive-iframe.tsx`** (lignes 109-153) **RĂŽle** : Composant iframe avec Ă©coute de messages logout **Cookies** : Aucune manipulation directe - Écoute `postMessage` depuis iframes - DĂ©clenche logout si message `KEYCLOAK_LOGOUT` reçu - **Note** : Logique similaire Ă  `layout-wrapper.tsx` mais dans le composant iframe --- ## 📝 FICHIERS TYPES - DĂ©finitions TypeScript ### 16. **`types/next-auth.d.ts`** **RĂŽle** : Extensions TypeScript pour NextAuth **Cookies** : Aucune manipulation, dĂ©finit les types de session/JWT --- ## 🔍 ANALYSE DÉTAILLÉE DES COOKIES ### Cookies NextAuth #### 1. **`next-auth.session-token`** (ou variantes sĂ©curisĂ©es) - **Domaine** : Domaine du dashboard - **Path** : `/` - **HttpOnly** : `true` (sĂ©curitĂ©) - **Secure** : `true` (si HTTPS) - **SameSite** : `Lax` (par dĂ©faut) - **Contenu** : JWT encryptĂ© contenant : - `accessToken` (Keycloak) - `refreshToken` (Keycloak) - `idToken` (Keycloak) - DonnĂ©es utilisateur (id, email, roles, etc.) - **DurĂ©e** : 4 heures (configurĂ© dans `options.ts`) - **Créé** : Lors de `signIn()` rĂ©ussi - **SupprimĂ©** : Lors de `signOut()` ou expiration - **Variantes** : - `__Secure-next-auth.session-token` (si HTTPS) - `__Host-next-auth.session-token` (si domaine racine) #### 2. **`next-auth.csrf-token`** - **Domaine** : Domaine du dashboard - **Path** : `/` - **HttpOnly** : `true` - **Secure** : `true` (si HTTPS) - **SameSite** : `Lax` - **Contenu** : Token CSRF pour protection OAuth - **DurĂ©e** : Session (supprimĂ© Ă  la fermeture du navigateur) - **Créé** : Lors de la premiĂšre requĂȘte OAuth - **SupprimĂ©** : À la fermeture du navigateur - **Important** : **N'EST PAS supprimĂ©** par `clearAuthCookies()` (nĂ©cessaire pour OAuth) #### 3. **`next-auth.state`** - **Domaine** : Domaine du dashboard - **Path** : `/` - **HttpOnly** : `true` - **Secure** : `true` (si HTTPS) - **SameSite** : `Lax` - **Contenu** : État OAuth pour validation du callback - **DurĂ©e** : Court (pendant le flow OAuth) - **Créé** : Lors de `signIn()` (dĂ©but flow OAuth) - **SupprimĂ©** : AprĂšs validation du callback OAuth - **Important** : **N'EST PAS supprimĂ©** par `clearAuthCookies()` (nĂ©cessaire pour OAuth) #### 4. **`next-auth.callback-url`** - **Domaine** : Domaine du dashboard - **Path** : `/` - **HttpOnly** : `true` - **Secure** : `true` (si HTTPS) - **SameSite** : `Lax` - **Contenu** : URL de redirection aprĂšs authentification - **DurĂ©e** : Court (pendant le flow OAuth) - **Créé** : Lors de `signIn()` avec `callbackUrl` - **SupprimĂ©** : AprĂšs redirection ### Cookies Keycloak #### 1. **`KEYCLOAK_SESSION`** - **Domaine** : Domaine Keycloak (peut ĂȘtre diffĂ©rent du dashboard) - **Path** : `/` ou `/realms/{realm}` - **HttpOnly** : `true` - **Secure** : `true` (si HTTPS) - **SameSite** : `Lax` ou `None` (pour cross-site) - **Contenu** : Identifiant de session SSO Keycloak - **DurĂ©e** : ConfigurĂ© dans Keycloak (typiquement 30 min - quelques heures) - **Créé** : Lors de l'authentification Keycloak - **SupprimĂ©** : Lors de logout Keycloak ou expiration - **ProblĂšme** : **Ne peut pas ĂȘtre supprimĂ©** depuis le dashboard si domaine diffĂ©rent #### 2. **`KEYCLOAK_IDENTITY`** - **Domaine** : Domaine Keycloak - **Path** : `/` ou `/realms/{realm}` - **HttpOnly** : `true` - **Secure** : `true` - **SameSite** : `Lax` ou `None` - **Contenu** : IdentitĂ© utilisateur Keycloak - **DurĂ©e** : MĂȘme que `KEYCLOAK_SESSION` - **Créé** : Lors de l'authentification Keycloak - **SupprimĂ©** : Lors de logout Keycloak ou expiration #### 3. **`AUTH_SESSION_ID`** - **Domaine** : Domaine Keycloak - **Path** : `/` ou `/realms/{realm}` - **HttpOnly** : `true` - **Secure** : `true` - **SameSite** : `Lax` ou `None` - **Contenu** : ID de session d'authentification - **DurĂ©e** : Court (pendant le flow d'authentification) - **Créé** : Lors du dĂ©but du flow d'authentification - **SupprimĂ©** : AprĂšs authentification rĂ©ussie ou Ă©chec ### Cookies Custom #### 1. **`logout_in_progress`** - **Domaine** : Domaine du dashboard - **Path** : `/` - **HttpOnly** : `false` (accessible via JavaScript) - **Secure** : `false` - **SameSite** : Non dĂ©fini - **Contenu** : `"true"` - **DurĂ©e** : 60 secondes (`max-age=60`) - **Créé** : Lors de `signOut()` (dans `signout-handler.tsx`, `main-nav.tsx`, `layout-wrapper.tsx`) - **SupprimĂ©** : Expire aprĂšs 60s ou manuellement - **Usage** : EmpĂȘche l'auto-login aprĂšs logout --- ## 🔄 FLOW COMPLET DE LOGIN ### Étape 1 : Utilisateur accĂšde Ă  `/signin` **Fichier** : `app/signin/page.tsx` **Cookies** : - VĂ©rifie si `next-auth.session-token` existe - Si existe mais `status === "unauthenticated"` → Session invalidĂ©e - Si n'existe pas → Nouvel utilisateur, dĂ©clenche auto-login ### Étape 2 : Auto-login dĂ©clenchĂ© **Fichier** : `app/signin/page.tsx` (ligne 118) **Action** : `signIn("keycloak", { callbackUrl: "/" })` **Cookies créés** : - `next-auth.csrf-token` (par NextAuth) - `next-auth.state` (par NextAuth) - `next-auth.callback-url` (par NextAuth) ### Étape 3 : Redirection vers Keycloak **Fichier** : `app/api/auth/[...nextauth]/route.ts` → NextAuth interne **URL** : `${KEYCLOAK_ISSUER}/protocol/openid-connect/auth?...&prompt=login` **Cookies Keycloak créés** : - `AUTH_SESSION_ID` (par Keycloak) ### Étape 4 : Authentification Keycloak **Fichier** : Keycloak serveur **Cookies Keycloak créés** : - `KEYCLOAK_SESSION` (session SSO) - `KEYCLOAK_IDENTITY` (identitĂ© utilisateur) ### Étape 5 : Callback OAuth **Fichier** : `app/api/auth/callback/keycloak` (gĂ©rĂ© par NextAuth) **Cookies** : - `next-auth.state` vĂ©rifiĂ© et supprimĂ© - `next-auth.callback-url` lu et utilisĂ© ### Étape 6 : JWT Callback **Fichier** : `app/api/auth/options.ts` → `jwt` callback (ligne 196) **Cookies** : - Lit `next-auth.session-token` (dĂ©cryptĂ©) - Stocke tokens Keycloak dans le JWT - **CrĂ©e** `next-auth.session-token` (nouveau JWT avec tokens) ### Étape 7 : Session Callback **Fichier** : `app/api/auth/options.ts` → `session` callback (ligne 283) **Cookies** : Lit `next-auth.session-token` pour construire la session ### Étape 8 : Redirection vers `/` **Fichier** : `app/signin/page.tsx` (ligne 72) **Cookies** : `next-auth.session-token` maintenant prĂ©sent ### Étape 9 : Initialisation Storage **Fichier** : `app/signin/page.tsx` (lignes 126-158) **Action** : Appelle `/api/storage/init` **Cookies** : Utilise `next-auth.session-token` (via `getServerSession()`) --- ## 🔄 FLOW COMPLET DE LOGOUT ### Étape 1 : Utilisateur clique "DĂ©connexion" **Fichiers** : - `components/main-nav.tsx` (ligne 364) - OU `components/auth/signout-handler.tsx` (ligne 11) - OU `components/layout/layout-wrapper.tsx` (ligne 32) si message iframe **Cookies créés** : - `logout_in_progress=true; path=/; max-age=60` (ligne 16/369/38) - `sessionStorage.setItem('just_logged_out', 'true')` (ligne 14/367/37) ### Étape 2 : Suppression cookies NextAuth **Fichier** : `lib/session.ts` → `clearAuthCookies()` (ligne 93) **Cookies supprimĂ©s** : - `next-auth.session-token` (et variantes) - **PAS** `next-auth.csrf-token` (nĂ©cessaire pour OAuth) - **PAS** `next-auth.state` (nĂ©cessaire pour OAuth) ### Étape 3 : Tentative suppression cookies Keycloak **Fichier** : `lib/session.ts` → `clearKeycloakCookies()` (ligne 115) **Cookies tentĂ©s de supprimer** : - `KEYCLOAK_SESSION`, `KEYCLOAK_IDENTITY`, etc. - **Limitation** : Échoue si Keycloak sur domaine diffĂ©rent ### Étape 4 : Fin de session SSO via Admin API **Fichier** : `app/api/auth/end-sso-session/route.ts` (ligne 15) **Action** : `adminClient.users.logout({ id: userId })` **Cookies** : - Keycloak supprime **toutes** les sessions cĂŽtĂ© serveur - Les cookies Keycloak deviennent invalides (mais restent dans le navigateur) ### Étape 5 : SignOut NextAuth **Fichier** : `components/auth/signout-handler.tsx` (ligne 52) **Action** : `signOut({ callbackUrl: "/signin?logout=true", redirect: false })` **Cookies supprimĂ©s** : - `next-auth.session-token` (supprimĂ© cĂŽtĂ© serveur) ### Étape 6 : Redirection vers Keycloak Logout **Fichier** : `components/auth/signout-handler.tsx` (ligne 58) **URL** : `${KEYCLOAK_ISSUER}/protocol/openid-connect/logout?...&id_token_hint=...&kc_action=LOGOUT` **Cookies Keycloak** : - Keycloak supprime ses cookies (si mĂȘme domaine ou cross-domain configurĂ©) ### Étape 7 : Redirection vers `/signin?logout=true` **Fichier** : Keycloak → `app/signin/page.tsx` **Cookies** : - `next-auth.session-token` : SupprimĂ© - `KEYCLOAK_SESSION` : Peut encore exister (si domaine diffĂ©rent) - `logout_in_progress` : Existe encore (60s) ### Étape 8 : DĂ©tection logout dans signin **Fichier** : `app/signin/page.tsx` (lignes 17-67) **Cookies vĂ©rifiĂ©s** : - `logout_in_progress` (ligne 19) - `next-auth.session-token` (ligne 25-29) - `sessionStorage.getItem('just_logged_out')` (ligne 20) **Comportement** : - Si `logout=true` dans URL → Affiche message "Vous avez Ă©tĂ© dĂ©connectĂ©" - Si cookie session existe mais invalide → EmpĂȘche auto-login - Si pas de cookie session → Auto-login aprĂšs 1s (nouvel utilisateur) --- ## ⚠ PROBLÈMES IDENTIFIÉS ### ProblĂšme 1 : Cookies Keycloak non supprimables **Fichier** : `lib/session.ts` → `clearKeycloakCookies()` **Cause** : Cookies Keycloak sur domaine diffĂ©rent **Impact** : Les cookies Keycloak persistent aprĂšs logout dashboard **Solution actuelle** : Appel Ă  Keycloak logout endpoint avec `id_token_hint` ### ProblĂšme 2 : Session SSO Keycloak peut persister **Fichier** : `app/api/auth/options.ts` (ligne 154) **Cause** : `prompt=login` force le prompt, mais si SSO session existe, Keycloak peut auto-authentifier **Impact** : Utilisateur peut ĂȘtre reconnectĂ© automatiquement sans credentials **Solution actuelle** : `prompt=login` + appel Admin API pour terminer session SSO ### ProblĂšme 3 : DĂ©tection session invalide complexe **Fichier** : `app/signin/page.tsx` (lignes 17-67) **Cause** : Logique complexe pour dĂ©tecter si session invalidĂ©e vs nouvel utilisateur **Impact** : Auto-login peut se dĂ©clencher incorrectement **Solution actuelle** : VĂ©rification multiple (cookies, sessionStorage, URL params) ### ProblĂšme 4 : Race condition logout/login **Fichier** : `app/signin/page.tsx` (lignes 69-124) **Cause** : Auto-login avec dĂ©lai de 1s peut se dĂ©clencher pendant logout **Impact** : Utilisateur peut ĂȘtre reconnectĂ© immĂ©diatement aprĂšs logout **Solution actuelle** : Flags `logout_in_progress` et `session_invalidated` --- ## 📊 RÉSUMÉ DES FICHIERS PAR CATÉGORIE ### Configuration Core (2 fichiers) 1. `app/api/auth/[...nextauth]/route.ts` 2. `app/api/auth/options.ts` ⭐ ### Pages (2 fichiers) 3. `app/signin/page.tsx` ⭐ 4. `app/signout/page.tsx` ### Composants Auth (4 fichiers) 5. `components/auth/signout-handler.tsx` ⭐ 6. `components/auth/auth-check.tsx` 7. `components/auth/signin-form.tsx` (si existe) 8. `components/auth/login-card.tsx` (si existe) ### Composants Layout (2 fichiers) 9. `components/layout/layout-wrapper.tsx` ⭐ 10. `components/providers.tsx` ### Navigation (1 fichier) 11. `components/main-nav.tsx` ⭐ ### Utilitaires (2 fichiers) 12. `lib/session.ts` ⭐ 13. `lib/keycloak.ts` ### API Routes (2 fichiers) 14. `app/api/auth/end-sso-session/route.ts` ⭐ 15. `app/api/auth/refresh-keycloak-session/route.ts` ### Layout Root (1 fichier) 16. `app/layout.tsx` ### Iframe (1 fichier) 17. `app/components/responsive-iframe.tsx` ### Types (1 fichier) 18. `types/next-auth.d.ts` **Total : 18 fichiers principaux** --- ## 🎯 FICHIERS CRITIQUES (⭐) Les fichiers marquĂ©s ⭐ sont **critiques** pour le flow login/logout : 1. **`app/api/auth/options.ts`** - Configuration NextAuth, callbacks JWT/session 2. **`app/signin/page.tsx`** - Logique complexe de dĂ©tection logout/auto-login 3. **`components/auth/signout-handler.tsx`** - Flow complet de logout 4. **`lib/session.ts`** - Gestion des cookies (suppression) 5. **`components/layout/layout-wrapper.tsx`** - Écoute logout depuis iframes 6. **`components/main-nav.tsx`** - Bouton logout 7. **`app/api/auth/end-sso-session/route.ts`** - Termine session SSO Keycloak --- ## 📝 NOTES IMPORTANTES 1. **Cookies NextAuth** : GĂ©rĂ©s automatiquement par NextAuth, pas besoin de manipulation manuelle sauf pour suppression 2. **Cookies Keycloak** : Ne peuvent pas ĂȘtre supprimĂ©s depuis le dashboard si domaine diffĂ©rent (limitation navigateur) 3. **Session SSO** : Doit ĂȘtre terminĂ©e via Admin API Keycloak pour ĂȘtre complĂštement supprimĂ©e 4. **Auto-login** : Logique complexe pour distinguer nouvel utilisateur vs session invalidĂ©e 5. **Iframe logout** : Communication via `postMessage` pour synchroniser logout --- **Document créé le** : $(date) **DerniĂšre mise Ă  jour** : Analyse complĂšte du workflow login/logout avec focus sur les cookies