import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; import App from './App.jsx'; import './index.css'; import { MsalProvider } from "@azure/msal-react"; import { PublicClientApplication, EventType } from "@azure/msal-browser"; import { msalConfig } from "./authConfig"; // ✅ CRITIQUE : Créer l'instance MSAL const msalInstance = new PublicClientApplication(msalConfig); // ✅ CRITIQUE : Fonction d'initialisation asynchrone async function initializeApp() { console.log('🚀 Initialisation de l\'application...'); console.log('🔗 Hash actuel:', window.location.hash); console.log('📍 URL complète:', window.location.href); // ✅ Sauvegarder le hash OAuth s'il existe (avant que quoi que ce soit ne le supprime) const currentHash = window.location.hash; if (currentHash && currentHash.includes('code=')) { console.log('🚨 Hash OAuth détecté - Sauvegarde...'); sessionStorage.setItem('oauth_hash_backup', currentHash); sessionStorage.setItem('oauth_url_backup', window.location.href); sessionStorage.setItem('oauth_capture_time', Date.now().toString()); } try { // ✅ CRITIQUE : Initialiser MSAL (requis depuis MSAL 3.x) console.log('⏳ Initialisation MSAL...'); await msalInstance.initialize(); console.log('✅ MSAL initialisé'); // ✅ CRITIQUE : Traiter la redirection OAuth AVANT le rendu React console.log('⏳ Traitement handleRedirectPromise...'); const response = await msalInstance.handleRedirectPromise(); if (response) { console.log('✅ Réponse OAuth reçue:', { account: response.account?.username, hasAccessToken: !!response.accessToken, scopes: response.scopes }); // Nettoyer le hash de l'URL après traitement réussi window.history.replaceState({}, document.title, window.location.pathname); // Nettoyer le backup sessionStorage.removeItem('oauth_hash_backup'); sessionStorage.removeItem('oauth_url_backup'); sessionStorage.removeItem('oauth_capture_time'); } else { console.log('ℹ️ Pas de réponse OAuth (normal si pas de redirection en cours)'); // Vérifier s'il y avait un code mais pas de réponse (échec silencieux) const backupHash = sessionStorage.getItem('oauth_hash_backup'); if (backupHash && backupHash.includes('code=')) { const captureTime = sessionStorage.getItem('oauth_capture_time'); const elapsed = Date.now() - parseInt(captureTime || '0'); // Si le backup a moins de 30 secondes, c'est un échec récent if (elapsed < 30000) { console.warn('⚠️ Code OAuth détecté mais non traité par MSAL'); console.log('🔧 Le hash était:', backupHash.substring(0, 100) + '...'); } // Nettoyer le backup après vérification sessionStorage.removeItem('oauth_hash_backup'); sessionStorage.removeItem('oauth_url_backup'); sessionStorage.removeItem('oauth_capture_time'); } } // ✅ Configurer les événements MSAL pour le debug msalInstance.addEventCallback((event) => { if (event.eventType === EventType.LOGIN_SUCCESS) { console.log('🎉 LOGIN_SUCCESS event:', event.payload?.account?.username); } if (event.eventType === EventType.LOGIN_FAILURE) { console.error('❌ LOGIN_FAILURE event:', event.error); } if (event.eventType === EventType.ACQUIRE_TOKEN_SUCCESS) { console.log('🔑 Token acquis pour:', event.payload?.account?.username); } if (event.eventType === EventType.HANDLE_REDIRECT_END) { console.log('🏁 HANDLE_REDIRECT_END'); } }); // ✅ Définir le compte actif si disponible const accounts = msalInstance.getAllAccounts(); if (accounts.length > 0) { console.log('📊 Comptes MSAL trouvés:', accounts.length); msalInstance.setActiveAccount(accounts[0]); console.log('✅ Compte actif défini:', accounts[0].username); } } catch (error) { console.error('❌ Erreur lors de l\'initialisation MSAL:', error); // En cas d'erreur, nettoyer et continuer sessionStorage.removeItem('oauth_hash_backup'); sessionStorage.removeItem('oauth_url_backup'); sessionStorage.removeItem('oauth_capture_time'); // Nettoyer l'URL si elle contient encore le code if (window.location.hash.includes('code=')) { window.history.replaceState({}, document.title, window.location.pathname); } } // ✅ Rendre l'application React APRÈS l'initialisation MSAL console.log('🎨 Rendu de l\'application React...'); createRoot(document.getElementById('root')).render( ); } // ✅ Lancer l'initialisation initializeApp();