diff --git a/app/pages/auth/cie/callback.vue b/app/pages/auth/cie/callback.vue index 777842e..efefe76 100644 --- a/app/pages/auth/cie/callback.vue +++ b/app/pages/auth/cie/callback.vue @@ -35,10 +35,23 @@ const scheduleNextPoll = () => { pollTimer = setTimeout(checkSession, 2000) } +const redirectToLoginError = async (code: string, fallbackMessage: string) => { + stopPolling() + isLoading.value = false + + try { + await router.replace({ + path: '/auth/login', + query: { cie_error: code } + }) + } catch { + errorMessage.value = fallbackMessage + } +} + const checkSession = async () => { if (!state.value) { - isLoading.value = false - errorMessage.value = 'Sessione CIE non valida: parametro state mancante.' + await redirectToLoginError('invalid_session', 'Sessione CIE non valida: parametro state mancante.') return } @@ -54,25 +67,19 @@ const checkSession = async () => { } if (['failed', 'expired', 'cancelled', 'error'].includes(res.status)) { - stopPolling() - isLoading.value = false - errorMessage.value = 'Autenticazione CIE non completata. Riprova dal login.' + await redirectToLoginError('failed', 'Autenticazione CIE non completata. Riprova dal login.') return } if (attempts >= maxAttempts) { - stopPolling() - isLoading.value = false - errorMessage.value = 'Tempo di attesa scaduto durante la verifica CIE. Riprova.' + await redirectToLoginError('timeout', 'Tempo di attesa scaduto durante la verifica CIE. Riprova.') return } statusMessage.value = 'Autenticazione completata sul provider. Attendo conferma finale da Visione...' scheduleNextPoll() } catch (err: any) { - stopPolling() - isLoading.value = false - errorMessage.value = err.data?.message || 'Errore durante la verifica della sessione CIE.' + await redirectToLoginError('verification_error', err.data?.message || 'Errore durante la verifica della sessione CIE.') } } diff --git a/app/pages/auth/login.vue b/app/pages/auth/login.vue index f36b37f..a969139 100644 --- a/app/pages/auth/login.vue +++ b/app/pages/auth/login.vue @@ -8,6 +8,7 @@ definePageMeta({ useHead({ title: 'Accedi - Visione' }) const runtimeConfig = useRuntimeConfig() +const route = useRoute() const { requestOtp, verifyOtp, handleLoginSuccess, startCieLogin } = useAuth() const otpStep = ref<1 | 2>(1) @@ -20,6 +21,21 @@ const otpCode = ref('') const cieCallbackUrl = `${runtimeConfig.public.url}/auth/cie/callback` +const cieErrorMessage = computed(() => { + const error = route.query.cie_error + + if (typeof error !== 'string') return '' + + const messages: Record = { + invalid_session: 'Sessione CIE non valida o incompleta. Avvia di nuovo accesso con CIE.', + failed: 'Autenticazione CIE non completata. Riprova dal pulsante Entra con CIE.', + timeout: 'Tempo di attesa scaduto durante verifica CIE. Riprova.', + verification_error: 'Errore durante verifica autenticazione CIE. Riprova tra poco.' + } + + return messages[error] || 'Accesso con CIE non riuscito. Riprova.' +}) + const handleRequestOtp = async () => { isLoading.value = true errorMessage.value = '' @@ -94,6 +110,10 @@ const handleCieLogin = async () => {
+ +