Files
zitadel/apps/login/locales/it.json
Max Peintner 6661e3d7c6 fix(login): Improve Passkey Authentication Error Handling & Testing (#10971)
# Which Problems Are Solved

This PR enhances the passkey authentication flow with comprehensive
error handling, full internationalization support, and extensive test
coverage.

# How the Problems Are Solved

I18n:
- Replaced all hard-coded error messages with i18n translation keys
- Consistent error messaging throughout the passkey flow
- Added specific error handling for passkey cancellation
(NotAllowedError)
- Implemented fallback errors for undefined/missing responses
- Better error messages for:
  - Session retrieval failures
  - Challenge request failures
  - User verification errors
  - Redirect determination issues

Tests:
- Added `login-passkey.test.tsx` with 100+ test cases covering:
  - Successful verification flows
  - Error scenarios and edge cases
  - Props handling
  - Component lifecycle
- Added passkeys.test.ts with server-side function tests:
  - Session cookie retrieval
  - User validation
  - Custom lifetime handling
  - Critical fallback error paths

Try-catch blocks around critical user retrieval operations
Defensive checks for undefined responses from completeFlowOrGetUrl
Support for custom lifetime parameters
Cleaner error propagation

(cherry picked from commit d5d68aed4b)
2025-10-28 15:08:36 +01:00

462 lines
19 KiB
JSON

{
"common": {
"back": "Indietro",
"title": "Accedi con Zitadel"
},
"accounts": {
"title": "Account",
"description": "Seleziona l'account che vuoi utilizzare.",
"addAnother": "Aggiungi un altro account",
"noResults": "Nessun account trovato",
"verified": "verificato",
"expired": "scaduto"
},
"logout": {
"title": "Esci",
"description": "Seleziona l'account che desideri uscire",
"noResults": "Nessun account trovato",
"clear": "Elimina sessione",
"verifiedAt": "Ultima attività: {time}",
"success": {
"title": "Uscita riuscita",
"description": "Hai effettuato l'uscita con successo."
}
},
"loginname": {
"title": "Bentornato!",
"description": "Inserisci i tuoi dati di accesso.",
"register": "Registrati come nuovo utente",
"submit": "Continua",
"labels": {
"loginname": "Nome di accesso",
"username": "Nome utente",
"usernameOrPhoneNumber": "Nome utente o numero di telefono",
"usernameOrEmail": "Nome utente o e-mail"
},
"required": {
"loginName": "Questo campo è obbligatorio"
},
"errors": {
"internalError": "Si è verificato un errore interno",
"couldNotGetLoginSettings": "Impossibile ottenere le impostazioni di accesso",
"couldNotSearchUsers": "Impossibile cercare gli utenti",
"couldNotGetDomain": "Impossibile ottenere il dominio",
"couldNotGetHost": "Impossibile ottenere l'host",
"couldNotStartIDPFlow": "Impossibile avviare il flusso IDP",
"moreThanOneUserFound": "È stato trovato più di un utente. Fornisci un identificatore univoco.",
"userNotFound": "Utente non trovato nel sistema",
"couldNotCreateSession": "Impossibile creare la sessione per l'utente",
"initialUserNotSupported": "Utente iniziale non supportato",
"usernamePasswordNotAllowed": "Nome utente e password non consentiti! Contatta l'amministratore per maggiori informazioni.",
"passkeysNotAllowed": "Passkey non consentite! Contatta l'amministratore per maggiori informazioni.",
"couldNotFindIdentityProvider": "Impossibile trovare il provider di identità.",
"userNotActive": "L'utente non è attivo. Contatta l'amministratore per maggiori informazioni."
}
},
"zitadel": {
"errors": {
"errorOccured": "Si è verificato un errore",
"multipleUsersFound": "Trovati più utenti",
"userNotFound": "Utente non trovato nel sistema"
}
},
"password": {
"verify": {
"title": "Password",
"description": "Inserisci la tua password.",
"resetPassword": "Reimposta Password",
"submit": "Continua",
"labels": {
"password": "Password"
},
"required": {
"password": "Questo campo è obbligatorio"
},
"errors": {
"couldNotVerifyPassword": "Impossibile verificare la password",
"couldNotResetPassword": "Impossibile reimpostare la password"
},
"info": {
"passwordResetSent": "La password è stata reimpostata. Controlla la tua e-mail"
}
},
"set": {
"title": "Imposta Password",
"description": "Imposta la password per il tuo account",
"codeSent": "Un codice è stato inviato al tuo indirizzo email.",
"noCodeReceived": "Non hai ricevuto un codice?",
"resend": "Invia di nuovo",
"submit": "Continua",
"labels": {
"code": "Codice",
"newPassword": "Nuova password",
"confirmPassword": "Conferma password"
},
"required": {
"code": "Questo campo è obbligatorio",
"newPassword": "Devi fornire una password!",
"confirmPassword": "Questo campo è obbligatorio"
},
"errors": {
"couldNotSetPassword": "Impossibile impostare la password",
"couldNotResetPassword": "Impossibile reimpostare la password",
"couldNotVerifyPassword": "Impossibile verificare la password"
}
},
"change": {
"title": "Cambia Password",
"description": "Imposta la password per il tuo account",
"submit": "Continua",
"labels": {
"newPassword": "Nuova password",
"confirmPassword": "Conferma password"
},
"required": {
"newPassword": "Devi fornire una nuova password!",
"confirmPassword": "Questo campo è obbligatorio"
},
"errors": {
"couldNotChangePassword": "Impossibile modificare la password",
"couldNotVerifyPassword": "Impossibile verificare la password",
"unknownError": "Errore sconosciuto"
}
},
"complexity": {
"length": "Deve contenere almeno {minLength} caratteri.",
"hasSymbol": "Deve includere un simbolo.",
"hasNumber": "Deve includere un numero.",
"hasUppercase": "Deve includere una lettera maiuscola.",
"hasLowercase": "Deve includere una lettera minuscola.",
"equals": "La conferma della password corrisponde.",
"matches": "Corrisponde",
"doesNotMatch": "Non corrisponde"
},
"errors": {
"noHostFound": "Nessun host trovato",
"couldNotSendResetLink": "Impossibile inviare il link per il ripristino della password",
"couldNotCreateSessionForUser": "Impossibile creare una sessione per l'utente",
"couldNotVerifyPassword": "Impossibile verificare la password",
"failedToAuthenticate": "Autenticazione non riuscita. Hai effettuato {failedAttempts} di {maxPasswordAttempts} tentativi di password.{lockoutMessage}",
"failedToAuthenticateNoLimit": "Autenticazione non riuscita.",
"accountLockedContactAdmin": " Contatta l'amministratore per sbloccare il tuo account",
"userNotFound": "Utente non trovato nel sistema",
"initialUserNotSupported": "Utente iniziale non supportato",
"userInitialStateNotSupported": "Lo stato iniziale dell'utente non è supportato",
"codeOrVerificationRequired": "Devi fornire un codice o avere una verifica utente valida",
"verificationRequired": "È necessario effettuare la verifica utente",
"couldNotLoadSession": "Impossibile caricare la sessione",
"couldNotLoadAuthMethods": "Impossibile caricare i metodi di autenticazione",
"failedPrecondition": "Precondizione non soddisfatta",
"sessionNotValid": "La sessione non è valida"
}
},
"idp": {
"title": "Accedi con SSO",
"description": "Seleziona uno dei seguenti provider per accedere",
"orSignInWith": "o accedi con",
"signInWithApple": "Accedi con Apple",
"signInWithGoogle": "Accedi con Google",
"signInWithAzureAD": "Accedi con AzureAD",
"signInWithGithub": "Accedi con GitHub",
"signInWithGitlab": "Accedi con GitLab",
"loginError": {
"title": "Accesso fallito",
"description": "Si è verificato un errore durante il tentativo di accesso."
},
"linkingError": {
"title": "Collegamento account fallito",
"description": "Si è verificato un errore durante il tentativo di collegare il tuo account."
},
"completeRegister": {
"title": "Completa la registrazione",
"description": "Completa la registrazione del tuo account."
},
"accountNotFound": {
"title": "Account non trovato",
"description": "Non siamo riusciti a trovare un account associato alle tue credenziali del provider di identità.",
"info": "Nessun account esistente è stato trovato. Accedi con un account esistente o contatta il tuo amministratore per assistenza.",
"backToLogin": "Torna al login"
},
"registrationFailed": {
"title": "Registrazione non disponibile",
"description": "Non siamo riusciti a completare il processo di registrazione.",
"info": "Impossibile determinare l'organizzazione per la registrazione. Contatta il tuo amministratore per assistenza.",
"backToLogin": "Torna al login"
},
"processing": {
"message": "Elaborazione autenticazione in corso...",
"noRedirect": "Nessun reindirizzamento o errore ricevuto dal server",
"unexpectedError": "Si è verificato un errore imprevisto"
},
"errors": {
"missingParameters": "Parametri richiesti mancanti",
"missingIdpInfo": "Informazioni IDP mancanti",
"idpNotFound": "Provider di identità non trovato",
"linkingNotAllowed": "Il collegamento non è consentito per questo provider di identità",
"linkingFailed": "Collegamento del provider di identità all'account non riuscito",
"autoLinkingFailed": "Collegamento automatico dell'account non riuscito",
"userCreationFailed": "Creazione dell'account utente non riuscita",
"orgResolutionFailed": "Impossibile determinare l'organizzazione per la registrazione",
"sessionCreationFailed": "Impossibile creare la sessione o determinare il reindirizzamento",
"unknownError": "Si è verificato un errore sconosciuto"
}
},
"ldap": {
"title": "Accedi con LDAP",
"description": "Inserisci le tue credenziali LDAP.",
"submit": "Continua",
"labels": {
"username": "Nome utente",
"password": "Password"
},
"required": {
"username": "Questo campo è obbligatorio",
"password": "Questo campo è obbligatorio"
}
},
"mfa": {
"verify": {
"title": "Verifica la tua identità",
"description": "Scegli uno dei seguenti fattori.",
"noResults": "Nessun secondo fattore disponibile per la configurazione."
},
"set": {
"title": "Configura l'autenticazione a 2 fattori",
"description": "Scegli uno dei seguenti secondi fattori.",
"skip": "Salta"
}
},
"otp": {
"verify": {
"title": "Verifica l'autenticazione a 2 fattori",
"totpDescription": "Inserisci il codice dalla tua app di autenticazione.",
"smsDescription": "Inserisci il codice ricevuto via SMS.",
"emailDescription": "Inserisci il codice ricevuto via email.",
"noCodeReceived": "Non hai ricevuto un codice?",
"resendCode": "Invia di nuovo il codice",
"submit": "Continua",
"labels": {
"code": "Codice"
},
"required": {
"code": "Questo campo è obbligatorio"
}
},
"set": {
"title": "Configura l'autenticazione a 2 fattori",
"totpDescription": "Scansiona il codice QR con la tua app di autenticazione.",
"smsDescription": "Inserisci il tuo numero di telefono per ricevere un codice via SMS.",
"emailDescription": "Inserisci il tuo indirizzo email per ricevere un codice via email.",
"totpRegisterDescription": "Scansiona il codice QR o naviga manualmente all'URL.",
"submit": "Continua",
"labels": {
"code": "Codice"
},
"required": {
"code": "Questo campo è obbligatorio"
}
}
},
"passkey": {
"verify": {
"title": "Autenticati con una passkey",
"description": "Il tuo dispositivo chiederà la tua impronta digitale, il volto o il blocco schermo",
"info": {
"description": "Usa la passkey che hai configurato per autenticarti in modo sicuro. ",
"link": "Scopri di più sulle Passkey"
},
"usePassword": "Usa password",
"submit": "Continua",
"errors": {
"couldNotRequestChallenge": "Impossibile richiedere la sfida passkey",
"couldNotVerifyPasskey": "Impossibile verificare la passkey",
"noResponseReceived": "Verifica passkey fallita - nessuna risposta ricevuta",
"noRedirectProvided": "Verifica passkey completata ma nessun reindirizzamento fornito",
"couldNotRetrievePasskey": "Si è verificato un errore durante il recupero della passkey",
"verificationCancelled": "La verifica della passkey è stata annullata",
"verificationFailed": "Si è verificato un errore durante la verifica della passkey",
"couldNotFindSession": "Impossibile trovare la sessione",
"couldNotUpdateSession": "Impossibile aggiornare la sessione",
"userNotFound": "Utente non trovato nel sistema",
"couldNotDetermineRedirect": "Impossibile determinare l'URL di reindirizzamento dopo la verifica passkey",
"couldNotSetSession": "Impossibile impostare la sessione",
"couldNotGetUser": "Impossibile recuperare i dati dell'utente",
"couldNotRetrieveSessionCookie": "Impossibile recuperare il cookie di sessione"
}
},
"set": {
"title": "Configura una passkey",
"description": "Il tuo dispositivo chiederà la tua impronta digitale, il volto o il blocco schermo",
"info": {
"description": "Una passkey è un metodo di autenticazione su un dispositivo come la tua impronta digitale, Apple FaceID o simili.",
"link": "Autenticazione senza password"
},
"skip": "Salta",
"submit": "Continua"
}
},
"u2f": {
"verify": {
"title": "Verifica l'autenticazione a 2 fattori",
"description": "Verifica il tuo account con il tuo dispositivo."
},
"set": {
"title": "Configura l'autenticazione a 2 fattori",
"description": "Configura un dispositivo come secondo fattore.",
"submit": "Continua"
}
},
"register": {
"methods": {
"passkey": "Passkey",
"password": "Password"
},
"disabled": {
"title": "Registration disabled",
"description": "Registrazione disabilitata. Contatta l'amministratore di sistema per assistenza."
},
"missingdata": {
"title": "Registrazione",
"description": "Inserisci i tuoi dati per registrarti."
},
"title": "Registrati",
"description": "Crea il tuo account ZITADEL.",
"noMethodAvailableWarning": "Nessun metodo di autenticazione disponibile. Contatta l'amministratore di sistema per assistenza.",
"selectMethod": "Seleziona il metodo con cui desideri autenticarti",
"agreeTo": "Per registrarti devi accettare i termini e le condizioni",
"termsOfService": "Termini di Servizio",
"privacyPolicy": "Informativa sulla Privacy",
"submit": "Continua",
"password": {
"title": "Imposta Password",
"description": "Imposta la password per il tuo account",
"submit": "Continua",
"labels": {
"password": "Password",
"confirmPassword": "Conferma password"
},
"required": {
"password": "Devi fornire una password!",
"confirmPassword": "Questo campo è obbligatorio"
}
},
"labels": {
"firstname": "Nome",
"lastname": "Cognome",
"email": "E-mail"
},
"required": {
"firstname": "Questo campo è obbligatorio",
"lastname": "Questo campo è obbligatorio",
"email": "Questo campo è obbligatorio"
},
"errors": {
"couldNotCreateUser": "Impossibile creare l'utente",
"couldNotCreateSession": "Impossibile creare la sessione",
"userNotFound": "Utente non trovato nel sistema",
"couldNotLinkIDP": "Impossibile collegare l'IDP all'utente",
"couldNotRegisterUser": "Impossibile registrare l'utente"
}
},
"invite": {
"title": "Invita Utente",
"description": "Inserisci l'indirizzo email dell'utente che desideri invitare.",
"info": "L'utente riceverà un'email con ulteriori istruzioni.",
"notAllowed": "Non hai i permessi per invitare un utente.",
"submit": "Invita Utente",
"success": {
"title": "Invito inviato",
"description": "L'utente è stato invitato con successo.",
"verified": "L'utente è stato invitato e ha già verificato la sua email.",
"notVerifiedYet": "L'utente è stato invitato. Riceverà un'email con ulteriori istruzioni.",
"submit": "Invita un altro utente"
}
},
"signedin": {
"title": "Benvenuto {user}!",
"description": "Sei connesso.",
"continue": "Continua",
"error": {
"title": "Errore",
"description": "Si è verificato un errore durante il tentativo di accesso."
}
},
"verify": {
"userIdMissing": "Nessun userId fornito!",
"successTitle": "Utente verificato",
"successDescription": "L'utente è stato verificato con successo.",
"setupAuthenticator": "Configura autenticatore",
"verify": {
"title": "Verifica utente",
"description": "Inserisci il codice fornito nell'email di verifica.",
"noCodeReceived": "Non hai ricevuto un codice?",
"resendCode": "Invia di nuovo il codice",
"codeSent": "Un codice è stato appena inviato al tuo indirizzo email.",
"submit": "Continua",
"labels": {
"code": "Codice"
},
"required": {
"code": "Questo campo è obbligatorio"
}
},
"errors": {
"couldNotResendEmail": "Impossibile reinviare l'email",
"couldNotVerifyUser": "Impossibile verificare l'utente",
"couldNotVerifyInvite": "Impossibile verificare l'invito",
"couldNotVerifyEmail": "Impossibile verificare l'email",
"couldNotVerify": "Impossibile verificare",
"couldNotLoadUser": "Impossibile caricare l'utente",
"couldNotLoadAuthenticators": "Impossibile caricare gli autenticatori possibili",
"couldNotCreateSession": "Impossibile creare la sessione",
"noHostFound": "Nessun host trovato",
"userAlreadyVerified": "L'utente è già verificato!",
"couldNotResendInvite": "Impossibile reinviare l'invito",
"inviteSendFailed": "Impossibile inviare l'email di invito",
"emailSendFailed": "Impossibile inviare l'email di verifica"
}
},
"authenticator": {
"title": "Seleziona metodo di autenticazione",
"description": "Seleziona il metodo con cui desideri autenticarti",
"noMethodsAvailable": "Nessun metodo di autenticazione disponibile",
"allSetup": "Hai già configurato un autenticatore!",
"linkWithIDP": "o collega con un Identity Provider"
},
"device": {
"usercode": {
"title": "Codice dispositivo",
"description": "Inserisci il codice.",
"submit": "Continua",
"labels": {
"code": "Codice"
},
"required": {
"code": "Questo campo è obbligatorio"
}
},
"request": {
"title": "{appName} desidera connettersi:",
"description": "{appName} avrà accesso a:",
"disclaimer": "Cliccando su Consenti, autorizzi {appName} e Zitadel a utilizzare le tue informazioni in conformità con i rispettivi termini di servizio e politiche sulla privacy. Puoi revocare questo accesso in qualsiasi momento.",
"submit": "Consenti",
"deny": "Nega"
},
"scope": {
"openid": "Verifica la tua identità.",
"email": "Accedi al tuo indirizzo email.",
"profile": "Accedi alle informazioni complete del tuo profilo.",
"offline_access": "Consenti l'accesso offline al tuo account."
}
},
"error": {
"noUserCode": "Nessun codice utente fornito!",
"noDeviceRequest": "Nessuna richiesta di dispositivo trovata.",
"unknownContext": "Impossibile ottenere il contesto dell'utente. Assicurati di inserire prima il nome utente o di fornire un loginName come parametro di ricerca.",
"sessionExpired": "La tua sessione attuale è scaduta. Effettua nuovamente l'accesso.",
"failedLoading": "Impossibile caricare i dati. Riprova.",
"tryagain": "Riprova",
"couldNotContinueSession": "Impossibile continuare con la sessione - informazioni utente mancanti"
}
}