Case study

Zoho ottiene accessi 6 volte più veloci con l'integrazione di passkey e Gestore delle credenziali

10 minuti di lettura

In qualità di sviluppatore Android, cerchi costantemente modi per migliorare la sicurezza, l'esperienza utente e semplificare lo sviluppo. Zoho, una suite software completa basata su cloud incentrata sulla sicurezza e sulle esperienze fluide, ha ottenuto miglioramenti significativi adottando le passkey nella sua app per Android OneAuth.

Dall'integrazione delle passkey nel 2024, Zoho ha raggiunto velocità di accesso fino a 6 volte superiori rispetto ai metodi precedenti e una crescita del 31% su base mensile (MoM) nell'adozione delle passkey.

Questo case study esamina l'adozione delle passkey e dell'API Credential Manager di Android da parte di Zoho per risolvere le difficoltà di autenticazione. Descrive in dettaglio la procedura di implementazione tecnica ed evidenzia i risultati di impatto.

Superare le sfide di autenticazione

Zoho utilizza una combinazione di metodi di autenticazione per proteggere gli account utente. Tra questi, Zoho OneAuth, la sua soluzione di autenticazione a più fattori (MFA), che supportava sia l'autenticazione basata su password sia quella senza password tramite notifiche push, codici QR e password uniche basate sul tempo (TOTP). Zoho supportava anche gli accessi federati, consentendo l'autenticazione tramite SAML (Security Assertion Markup Language) e altri provider di identità di terze parti.

Sfide

Zoho, come molte organizzazioni, mirava a migliorare la sicurezza dell'autenticazione e l'esperienza utente, riducendo al contempo gli oneri operativi. Le principali sfide che hanno portato all'adozione delle passkey includono:

  • Vulnerabilità della sicurezza: i metodi tradizionali basati su password hanno reso gli utenti vulnerabili agli attacchi di phishing e alle violazioni delle password.
  • Frizione utente: la stanchezza da password ha portato a password dimenticate, frustrazione e maggiore dipendenza da processi di recupero complessi.
  • Inefficienze operative: la gestione delle reimpostazioni delle password e dei problemi di MFA ha generato un overhead di assistenza significativo.
  • Preoccupazioni relative alla scalabilità: una base di utenti in crescita richiedeva una soluzione di autenticazione più sicura ed efficiente.

Perché passare alle passkey?

Le passkey sono state implementate nelle app di Zoho per risolvere le sfide di autenticazione offrendo un approccio senza password che migliora notevolmente la sicurezza e l'esperienza utente. Questa soluzione sfrutta l'autenticazione resistente al phishing, le credenziali sincronizzate nel cloud per un accesso senza problemi su più dispositivi e la biometria (ad esempio l'impronta digitale o il riconoscimento facciale), il PIN o la sequenza per gli accessi sicuri, riducendo così le vulnerabilità e gli inconvenienti associati alle password tradizionali.

Adottando le passkey con Gestore delle credenziali, Zoho ha ridotto i tempi di accesso di un massimo di 6 volte, ha ridotto i costi di assistenza relativi alle password e ha registrato una forte adozione da parte degli utenti, raddoppiando gli accessi con passkey in 4 mesi con una crescita del 31% su base mensile. Gli utenti di Zoho ora usufruiscono di accessi più rapidi e semplici e di una sicurezza resistente al phishing.

ANDDM_Zoho_Quote_fabrice.png

Implementazione con Gestore delle credenziali su Android

Quindi, in che modo Zoho ha ottenuto questi risultati? Ha utilizzato l'API Credential Manager di Android, la libreria Jetpack consigliata per l'implementazione dell'autenticazione su Android.

Gestore delle credenziali fornisce un'API unificata che semplifica la gestione dei vari metodi di autenticazione. Anziché gestire diverse API per password, passkey e accessi federati (come Accedi con Google), utilizzi una singola interfaccia.

L'implementazione delle passkey in Zoho ha richiesto modifiche sia lato client sia lato server. Ecco una suddivisione dettagliata della procedura di creazione, accesso e implementazione lato server delle passkey.

Creazione di passkey

passkey.png

Per creare una passkey, l'app recupera innanzitutto i dettagli di configurazione dal server di Zoho. Questa procedura include una verifica univoca, ad esempio l'impronta digitale o il riconoscimento facciale. Questi dati di verifica, formattati come stringa requestJson), vengono utilizzati dall'app per creare un CreatePublicKeyCredentialRequest. L'app chiama quindi il metodo credentialManager.createCredential, che chiede all'utente di autenticarsi utilizzando il blocco schermo del dispositivo (biometria, impronta digitale, PIN e così via).

Una volta che l'utente ha confermato, l'app riceve i nuovi dati delle credenziali della passkey, li invia di nuovo al server di Zoho per la verifica e il server memorizza le informazioni della passkey collegate all'account dell'utente. L'app rileva e gestisce gli errori o le annullamenti dell'utente durante la procedura.

Accedi

L'app per Android di Zoho avvia la procedura di accesso con passkey richiedendo le opzioni di accesso, inclusa una challenge, dal server di backend di Zoho. L'app utilizza quindi questi dati per creare un GetCredentialRequest, indicando che eseguirà l'autenticazione con una passkey. Quindi richiama l'API CredentialManager.getCredential() di Android con questa richiesta. Questa azione attiva un'interfaccia di sistema Android standardizzata, che chiede all'utente di scegliere il proprio account Zoho (se esistono più passkey) e di autenticarsi utilizzando il blocco schermo configurato del dispositivo (impronta digitale, scansione del volto o PIN). Una volta eseguita l'autenticazione, Gestore delle credenziali restituisce un'asserzione firmata (prova di accesso) all'app Zoho. L'app inoltra questa asserzione al server di Zoho, che verifica la firma rispetto alla chiave pubblica memorizzata dell'utente e convalida la challenge, completando la procedura di accesso sicuro.

Implementazione lato server

La transizione di Zoho al supporto delle passkey ha beneficiato del fatto che i suoi sistemi di backend erano già conformi a FIDO WebAuthn, il che ha semplificato la procedura di implementazione lato server. Tuttavia, sono state comunque necessarie modifiche specifiche per integrare completamente la funzionalità delle passkey.

La sfida più significativa ha riguardato l'adattamento dell'archivio credenziali. I metodi di autenticazione esistenti di Zoho, che utilizzavano principalmente password e token di sicurezza FIDO per l'autenticazione a più fattori, richiedevano approcci di archiviazione diversi rispetto alle passkey, che si basano su chiavi pubbliche crittografiche. Per risolvere questo problema, Zoho ha implementato un nuovo schema di database progettato appositamente per archiviare in modo sicuro le chiavi pubbliche delle passkey e i dati correlati in base ai protocolli WebAuthn. Questo nuovo sistema è stato creato insieme a un meccanismo di ricerca per convalidare e recuperare le credenziali in base alle informazioni dell'utente e del dispositivo, garantendo la compatibilità con le versioni precedenti dei metodi di autenticazione precedenti.

Un'altra modifica lato server ha riguardato l'implementazione della possibilità di gestire le richieste provenienti dai dispositivi Android. Le richieste di passkey provenienti dalle app Android utilizzano un formato di origine univoco (android:apk-key-hash:example) diverso dalle origini web standard che utilizzano un formato basato su URI (https://example.com/app). La logica del server doveva essere aggiornata per analizzare correttamente questo formato, estrarre l'hash dell'impronta SHA-256 del certificato di firma dell'app e convalidarlo rispetto a un elenco pre-registrato. Questo passaggio di verifica garantisce che le richieste di autenticazione provengano effettivamente dall'app per Android di Zoho e protegge dagli attacchi di phishing.

Questo snippet di codice mostra come il server controlla il formato di origine specifico di Android e convalida l'hash del certificato:

  val origin: String = clientData.getString("origin")

if (origin.startsWith("android:apk-key-hash:")) { 
    val originSplit: List<String> = origin.split(":")
    if (originSplit.size > 3) {
               val androidOriginHashDecoded: ByteArray = Base64.getDecoder().decode(originSplit[3])

                if (!androidOriginHashDecoded.contentEquals(oneAuthSha256FingerPrint)) {
            throw IAMException(IAMErrorCode.WEBAUTH003)
        }
    } else {
        // Optional: Handle the case where the origin string is malformed    }
}

Gestione degli errori

Zoho ha implementato robusti meccanismi di gestione degli errori per gestire gli errori rivolti agli utenti e agli sviluppatori. Un errore comune, CreateCredentialCancellationException, si è verificato quando gli utenti hanno annullato manualmente la configurazione della passkey. Zoho ha monitorato la frequenza di questo errore per valutare potenziali miglioramenti dell'esperienza utente. In base ai consigli sull'esperienza utente di Android, Zoho ha adottato misure per informare meglio gli utenti sulle passkey, assicurarsi che fossero a conoscenza della disponibilità delle passkey e promuovere l'adozione delle passkey durante i tentativi di accesso successivi.

Questo esempio di codice mostra l'approccio di Zoho per la gestione degli errori di creazione delle passkey più comuni:

  private fun handleFailure(e: CreateCredentialException) {
    val msg = when (e) {
        is CreateCredentialCancellationException -> {
            Analytics.addAnalyticsEvent(eventProtocol: "PASSKEY_SETUP_CANCELLED", GROUP_NAME)
            Analytics.addNonFatalException(e)
            "The operation was canceled by the user."
        }
        is CreateCredentialInterruptedException -> {
            Analytics.addAnalyticsEvent(eventProtocol: "PASSKEY_SETUP_INTERRUPTED", GROUP_NAME)
            Analytics.addNonFatalException(e)
            "Passkey setup was interrupted. Please try again."
        }
        is CreateCredentialProviderConfigurationException -> {
            Analytics.addAnalyticsEvent(eventProtocol: "PASSKEY_PROVIDER_MISCONFIGURED", GROUP_NAME)
            Analytics.addNonFatalException(e)
            "Credential provider misconfigured. Contact support."
        }
        is CreateCredentialUnknownException -> {
            Analytics.addAnalyticsEvent(eventProtocol: "PASSKEY_SETUP_UNKNOWN_ERROR", GROUP_NAME)
            Analytics.addNonFatalException(e)
            "An unknown error occurred during Passkey setup."
        }
        is CreatePublicKeyCredentialDomException -> {
            Analytics.addAnalyticsEvent(eventProtocol: "PASSKEY_WEB_AUTHN_ERROR", GROUP_NAME)
            Analytics.addNonFatalException(e)
            "Passkey creation failed: ${e.domError}"
        }
        else -> {
            Analytics.addAnalyticsEvent(eventProtocol: "PASSKEY_SETUP_FAILED", GROUP_NAME)
            Analytics.addNonFatalException(e)
            "An unexpected error occurred. Please try again."
        }
    }
}

Test delle passkey in ambienti intranet

Zoho ha dovuto affrontare una sfida iniziale nel testare le passkey in un ambiente intranet chiuso. La procedura di verifica di Gestore delle password di Google per le passkey richiede l'accesso al dominio pubblico per convalidare il dominio della relying party (RP). Tuttavia, l'ambiente di test interno di Zoho non disponeva di questo accesso a internet pubblico, il che ha causato il fallimento della procedura di verifica e ha ostacolato il test di autenticazione con passkey. Per risolvere questo problema, Zoho ha creato un ambiente di test accessibile pubblicamente, che includeva l'hosting di un server temporaneo con un file di link di asset e la convalida del dominio.

Questo esempio dal file assetlinks.json utilizzato nell'ambiente di test pubblico di Zoho mostra come associare il dominio della relying party all'app Android specificata per la convalida della passkey.

  [
    {
        "relation": [
            "delegate_permission/common.handle_all_urls",
            "delegate_permission/common.get_login_creds"
        ],
        "target": {
            "namespace": "android_app",
            "package_name": "com.zoho.accounts.oneauth",
            "sha256_cert_fingerprints": [
                "SHA_HEX_VALUE" 
            ]
        }
    }
]

Eseguire l'integrazione con un server FIDO esistente

Il sistema di passkey di Android utilizza il moderno standard FIDO2 WebAuthn. Questo standard richiede richieste in un formato JSON specifico, che contribuisce a mantenere la coerenza tra le applicazioni native e le piattaforme web. Per abilitare il supporto delle passkey di Android, Zoho ha apportato piccole modifiche di compatibilità e strutturali per generare ed elaborare correttamente le richieste che rispettano la struttura JSON FIDO2 richiesta.

Questo aggiornamento del server ha comportato diverse modifiche tecniche specifiche:

1. Conversione della codifica: il server converte la codifica URL Base64 (di uso comune in WebAuthn per campi come gli ID delle credenziali) nella codifica Base64 standard prima di archiviare i dati pertinenti. Lo snippet riportato di seguito mostra come un rawId potrebbe essere codificato in Base64 standard:

  // Convert rawId bytes to a standard Base64 encoded string for storage
val base64RawId: String = Base64.getEncoder().encodeToString(rawId.toByteArray())

2. Formato dell'elenco dei trasporti: per garantire un'elaborazione coerente dei dati, la logica del server gestisce gli elenchi di meccanismi di trasporto (come USB, NFC e Bluetooth, che specificano la modalità di comunicazione dell'autenticatore) come array JSON.

3. Allineamento dei dati client: il team di Zoho ha modificato la modalità di codifica e decodifica del campo clientDataJson da parte del server. In questo modo, la struttura dei dati si allinea esattamente alle aspettative delle API interne esistenti di Zoho. L'esempio riportato di seguito illustra una parte della logica di conversione applicata ai dati client prima che il server li elabori:

  private fun convertForServer(type: String): String {
    val clientDataBytes = BaseEncoding.base64().decode(type)
    val clientDataJson = JSONObject(String(clientDataBytes, StandardCharsets.UTF_8))
    val clientJson = JSONObject()
    val challengeFromJson = clientDataJson.getString("challenge")
    // 'challenge' is a technical identifier/token, not localizable text.
    clientJson.put("challenge", BaseEncoding.base64Url()
        .encode(challengeFromJson.toByteArray(StandardCharsets.UTF_8))) 

    clientJson.put("origin", clientDataJson.getString("origin"))
    clientJson.put("type", clientDataJson.getString("type"))
    clientJson.put("androidPackageName", clientDataJson.getString("androidPackageName"))
    return BaseEncoding.base64().encode(clientJson.toString().toByteArray())
}

Guida per l'utente e preferenze di autenticazione

Una parte fondamentale della strategia delle passkey di Zoho prevedeva di incoraggiare l'adozione da parte degli utenti, fornendo al contempo la flessibilità necessaria per soddisfare i diversi requisiti organizzativi. Questo risultato è stato ottenuto grazie a un'attenta progettazione dell'interfaccia utente e ai controlli dei criteri.

Zoho ha riconosciuto che le organizzazioni hanno esigenze di sicurezza diverse. Per soddisfare questa esigenza, Zoho ha implementato:

  • Applicazione da parte dell'amministratore: tramite il pannello di amministrazione di Zoho Directory, gli amministratori possono designare le passkey come metodo di autenticazione predefinito obbligatorio per l'intera organizzazione. Quando questo criterio è abilitato, i dipendenti sono tenuti a configurare una passkey al successivo accesso e a utilizzarla in futuro.
  • Scelta dell'utente: se un'organizzazione non applica un criterio specifico, i singoli utenti mantengono il controllo. Possono scegliere il metodo di autenticazione preferito durante l'accesso, selezionando le passkey o altre opzioni configurate tramite le impostazioni di autenticazione.

Per rendere l'adozione delle passkey interessante e semplice per gli utenti finali, Zoho ha implementato:

  • Configurazione semplice: Zoho ha integrato la configurazione delle passkey direttamente nell'app mobile Zoho OneAuth (disponibile per Android e iOS). Gli utenti possono configurare comodamente le passkey all'interno dell'app in qualsiasi momento, semplificando la transizione.
  • Accesso coerente: il supporto delle passkey è stato implementato nei principali punti di contatto con gli utenti, garantendo che gli utenti possano registrarsi e autenticarsi utilizzando le passkey tramite:
  • L'app mobile Zoho OneAuth (Android e iOS);
  • La pagina degli account web di Zoho.

Questo metodo ha garantito che la procedura di configurazione e utilizzo delle passkey fosse accessibile e integrata nelle piattaforme che già utilizzano, indipendentemente dal fatto che fosse obbligatoria per un amministratore o scelta dall'utente. Puoi scoprire di più su come creare flussi utente fluidi per l'autenticazione con passkey esplorando la nostra guida completa all'esperienza utente delle passkey.

Impatto sulla velocità degli sviluppatori e sull'efficienza dell'integrazione

Credential Manager, in quanto API unificata, ha anche contribuito a migliorare la produttività degli sviluppatori rispetto ai flussi di accesso precedenti. Ha ridotto la complessità della gestione separata di più metodi e API di autenticazione, con conseguente integrazione più rapida, da mesi a settimane, e un minor numero di errori di implementazione. Nel complesso, questo ha semplificato la procedura di accesso e migliorato l'affidabilità complessiva.

Implementando le passkey con Gestore delle credenziali, Zoho ha ottenuto miglioramenti significativi e misurabili in tutti i settori:

  • Miglioramenti significativi della velocità
    • Accesso 2 volte più veloce rispetto all'autenticazione con password tradizionale.
    • Accesso 4 volte più veloce rispetto al nome utente o al numero di cellulare con autenticazione OTP via email o SMS.
    • Accesso 6 volte più veloce rispetto all'autenticazione con nome utente, password e OTP via SMS o autenticatore.
  • Costi di assistenza ridotti
    • Richieste di assistenza relative alle password ridotte, in particolare per le password dimenticate.
    • Costi inferiori associati alla 2FA basata su SMS, in quanto gli utenti esistenti possono eseguire l'onboarding direttamente con le passkey.
  • Forte adozione da parte degli utenti e maggiore sicurezza:
    • Gli accessi con passkey sono raddoppiati in soli 4 mesi, il che dimostra un'elevata accettazione da parte degli utenti.
    • Gli utenti che eseguono la migrazione alle passkey sono completamente protetti dalle comuni minacce di phishing e violazione delle password.
    • Con una crescita dell'adozione del 31% su base mensile, un numero sempre maggiore di utenti usufruisce ogni giorno di una maggiore sicurezza contro le vulnerabilità come il phishing e lo scambio di SIM.

Consigli e best practice

Per implementare correttamente le passkey su Android, gli sviluppatori devono tenere in considerazione le seguenti best practice:

  • Sfrutta l'API Credential Manager di Android:
    • Gestore delle credenziali semplifica il recupero delle credenziali, riducendo l'impegno degli sviluppatori e garantendo un'esperienza di autenticazione unificata.
    • Gestisce password, passkey e flussi di accesso federati in un'unica interfaccia.
  • Garantisci la coerenza della codifica dei dati durante la migrazione da altre soluzioni di autenticazione FIDO:
    • Assicurati di gestire una formattazione coerente per tutti gli input/output durante la migrazione da altre soluzioni di autenticazione FIDO, come i token di sicurezza FIDO.
  • Ottimizza la gestione degli errori e il logging:
    • Implementa una gestione degli errori efficace per un'esperienza utente fluida.
    • Fornisci messaggi di errore localizzati e utilizza log dettagliati per eseguire il debug e risolvere gli errori imprevisti.
  • Informa gli utenti sulle opzioni di recupero delle passkey:
    • Previeni gli scenari di blocco guidando in modo proattivo gli utenti sulle opzioni di recupero.
  • Monitora le metriche di adozione e il feedback degli utenti:
    • Monitora il coinvolgimento degli utenti, i tassi di adozione delle passkey e i tassi di successo degli accessi per continuare a ottimizzare l'esperienza utente.
    • Esegui test A/B su diversi flussi di autenticazione per migliorare la conversione e la fidelizzazione.

Le passkey, combinate con l'API Credential Manager di Android, offrono una soluzione di autenticazione potente e unificata che migliora la sicurezza e semplifica l'esperienza utente. Le passkey riducono notevolmente i rischi di phishing, il furto di credenziali e l'accesso non autorizzato. Invitiamo gli sviluppatori a provare l'esperienza nella loro app e a offrire ai propri utenti l'autenticazione più sicura.

Inizia a utilizzare le passkey e Gestore delle credenziali

Inizia a utilizzare le passkey e Gestore delle credenziali su Android utilizzando il nostro codice campione pubblico.

Se hai domande o problemi, puoi condividerli con noi tramite il tracker dei problemi relativi alle credenziali Android.

Scritto da:

Continua a leggere