From e4bac5b2652d50c3312978fd3cc0a10fe05f8806 Mon Sep 17 00:00:00 2001 From: Emanuele Ferrelli Date: Thu, 12 Jun 2025 17:51:54 +0200 Subject: [PATCH] Fix login --- src/views/pages/auth/Callback.vue | 90 ++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 30 deletions(-) diff --git a/src/views/pages/auth/Callback.vue b/src/views/pages/auth/Callback.vue index 7242b42..868f0ca 100644 --- a/src/views/pages/auth/Callback.vue +++ b/src/views/pages/auth/Callback.vue @@ -12,12 +12,13 @@ const visible = ref(false); onMounted(async () => { console.log('[Callback] Mounted on callback'); + try { await msalInstance.initialize(); console.log('[Callback] After initialize on callback'); } catch (e) { - console.error('[Callback] Errore durante initialize MSAL:', e); - message.value = "Errore durante l'inizializzazione di MSAL."; + console.error('[Callback] Error during MSAL initialization:', e); + message.value = "Error during MSAL initialization."; visible.value = true; return; } @@ -27,66 +28,95 @@ onMounted(async () => { response = await msalInstance.handleRedirectPromise(); console.log('[Callback] handleRedirectPromise response:', response); } catch (e) { - console.error('[Callback] Errore in handleRedirectPromise:', e); - message.value = 'Errore durante la gestione del redirect.'; + console.error('[Callback] Error in handleRedirectPromise:', e); + message.value = 'Error handling the redirect.'; visible.value = true; return; } if (response && response.accessToken) { + console.log('[Callback] Access token present:', response.accessToken); + + if (!response.account) { + console.warn('[Callback] No account present in the response. Possible MSAL anomaly.'); + } else { + console.log('[Callback] Account info:', response.account); + localStorage.setItem('msalUser', JSON.stringify(response.account)); + } + + // Wait 1 second to avoid race condition + await new Promise(resolve => setTimeout(resolve, 1000)); message.value = 'Logging in to the application...'; - console.log('[Callback] AccessToken presente:', response.accessToken); - console.log('[Callback] Account info:', response.account); - localStorage.setItem('msalUser', JSON.stringify(response.account)); - try { - console.log('[Callback] Chiamata a /msauth/exchange con accessToken...'); - const res = await axios.post( - '/msauth/exchange', - {}, - { - headers: { Authorization: `Bearer ${response.accessToken}` } + // Token exchange function with retry + const tryTokenExchange = async (retry = false) => { + try { + console.log(`[Callback] Call to /msauth/exchange (retry=${retry})...`); + const res = await axios.post( + '/msauth/exchange', + {}, + { + headers: { Authorization: `Bearer ${response.accessToken}` } + } + ); + return res; + } catch (err) { + if (!retry) { + console.warn('[Callback] First attempt failed, waiting 1500ms and retrying...'); + await new Promise(resolve => setTimeout(resolve, 1500)); + return tryTokenExchange(true); + } else { + throw err; } - ); - console.log('[Callback] Risposta da /msauth/exchange:', res); + } + }; + + let exchangeResponse; + try { + exchangeResponse = await tryTokenExchange(); + console.log('[Callback] Response from /msauth/exchange:', exchangeResponse); + + if (exchangeResponse.data.token) { + console.log('[Callback] Backend token received:', exchangeResponse.data.token); + auth.token(null, exchangeResponse.data.token, false); - if (res.data.token) { - console.log('[Callback] Token backend ricevuto:', res.data.token); - auth.token(null, res.data.token, false); try { - console.log('[Callback] Chiamata a auth.fetch()...'); + console.log('[Callback] Calling auth.fetch()...'); const userResponse = await auth.fetch(); - console.log('[Callback] Risposta user fetch:', userResponse); - console.log('[Callback] userResponse.data:', userResponse.data); - console.log('[Callback] userResponse.data.data:', userResponse.data.data); + console.log('[Callback] User fetch response:', userResponse); - if (!userResponse.data.data.selectedProject) { - console.log('[Callback] Nessun progetto selezionato, redirect a projects-list'); + const userData = userResponse.data?.data; + console.log('[Callback] userResponse.data.data:', userData); + + if (!userData || !userData.selectedProject) { + console.log('[Callback] No project selected, redirecting to projects-list'); router.push({ name: 'projects-list' }); } else { - console.log('[Callback] Progetto selezionato, redirect a scenario-list'); + console.log('[Callback] Project selected, redirecting to scenario-list'); router.push({ name: 'scenario-list' }); } } catch (fetchErr) { - console.error('[Callback] Errore su fetch user dopo token exchange:', fetchErr); + console.error('[Callback] Error fetching user after token exchange:', fetchErr); message.value = 'User not configured for this application. Contact the administrator for details.'; visible.value = true; } } else { + console.error('[Callback] No token received from backend:', exchangeResponse.data); message.value = 'User not configured for this application. Contact the administrator for details.'; - console.error('[Callback] Nessun token ricevuto dal backend:', res.data); + visible.value = true; } } catch (error) { - console.error('[Callback] Error on token exchange:', error.response ? error.response.data : error); + console.error('[Callback] Error on token exchange (after retry):', error.response ? error.response.data : error); message.value = 'An error occurred during the token exchange. Please try again.'; visible.value = true; } } else { - console.error('[Callback] Invalid response o access token mancante:', response); + console.error('[Callback] Invalid response or missing access token:', response); message.value = 'Authentication failed. Please log in again.'; visible.value = true; } }); +