Case study

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

Lettura di 10 minuti

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 su esperienze fluide, ha ottenuto miglioramenti significativi adottando le passkey nella sua app per Android OneAuth.

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

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

Superare le verifiche di autenticazione

Zoho utilizza una combinazione di metodi di autenticazione per proteggere gli account utente. Ciò includeva Zoho OneAuth, la loro soluzione di autenticazione a più fattori (MFA), che supportava l'autenticazione basata su password e senza password tramite notifiche push, codici QR e password temporanee e monouso (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 i carichi operativi. Le sfide principali che hanno portato all'adozione delle passkey includono:

  • Vulnerabilità della sicurezza: i metodi tradizionali basati su password hanno reso gli utenti vulnerabili ad attacchi di phishing e violazioni delle password.
  • Difficoltà per gli utenti: la stanchezza da password ha portato a password dimenticate, frustrazione e maggiore affidamento a procedure di recupero macchinose.
  • Inefficienze operative: la gestione dei problemi di reimpostazione della password e dell'autenticazione a più fattori ha generato un sovraccarico significativo dell'assistenza.
  • Problemi di scalabilità: una base di utenti in crescita richiedeva una soluzione di autenticazione più sicura ed efficiente.

Perché il passaggio alle passkey?

Le passkey sono state implementate nelle app di Zoho per risolvere i problemi di autenticazione offrendo un approccio senza password che migliora significativamente la sicurezza e l'esperienza utente. Questa soluzione sfrutta l'autenticazione resistente al phishing, le credenziali sincronizzate nel cloud per un accesso semplice su più dispositivi e la biometria (ad esempio il riconoscimento dell'impronta o facciale), il PIN o la sequenza per 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 fino a 6 volte, ha diminuito i costi di assistenza relativi alle password e ha registrato un'ampia adozione da parte degli utenti, raddoppiando gli accessi con passkey in 4 mesi con una crescita mensile del 31% . Gli utenti di Zoho ora usufruiscono di accessi più veloci e semplici e di una sicurezza resistente al phishing.

ANDDM_Zoho_Quote_fabrice.png

Implementazione con Gestore delle credenziali su Android

Quindi, come ha fatto Zoho a ottenere questi risultati? Hanno 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é destreggiarti tra 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 prima i dettagli di configurazione dal server di Zoho. Questa procedura include una verifica univoca, ad esempio l'impronta 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, PIN e così via).

Una volta che l'utente ha confermato l'operazione, 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. Gli errori o gli annullamenti da parte dell'utente durante la procedura vengono rilevati e gestiti dall'app.

Accedi

L'app Zoho per Android avvia la procedura di accesso con passkey richiedendo le opzioni di accesso, incluso un challenge univoco, dal server di backend di Zoho. L'app utilizza quindi questi dati per creare un GetCredentialRequest, indicando che l'autenticazione verrà eseguita con una passkey. Quindi richiama l'API Android CredentialManager.getCredential() 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, scansione del volto o PIN). Dopo l'autenticazione riuscita, 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 sfida, 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 il processo 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 specificamente 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 sull'utente e sul dispositivo, garantendo la compatibilità con i metodi di autenticazione precedenti.

Un altro aggiustamento lato server ha comportato l'implementazione della possibilità di gestire le richieste dai dispositivi Android. Le richieste di passkey provenienti da app per 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 del fingerprint SHA-256 del certificato di firma dell'app e convalidarlo rispetto a un elenco preregistrato. 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 verifica il formato dell'origine specifico per 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 solidi meccanismi di gestione degli errori per gestire gli errori rivolti agli utenti e agli sviluppatori. Un errore comune, CreateCredentialCancellationException, è stato visualizzato 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 per la UX di Android, Zoho ha adottato misure per informare meglio gli utenti sulle passkey, assicurarsi che fossero a conoscenza della loro disponibilità e promuoverne l'adozione durante i successivi tentativi di accesso.

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 all'interno di un ambiente intranet chiuso. La procedura di verifica del 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, causando il mancato completamento della procedura di verifica e ostacolando il test di autenticazione con passkey. Per superare questo problema, Zoho ha creato un ambiente di test accessibile pubblicamente, che includeva l'hosting di un server temporaneo con un file di collegamento delle risorse e la convalida del dominio.

Questo esempio del file assetlinks.json utilizzato nell'ambiente di test pubblico di Zoho mostra come associare il dominio della relying party all'app per 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, il che contribuisce a mantenere la coerenza tra le applicazioni native e le piattaforme web. Per attivare il supporto delle passkey Android, Zoho ha apportato piccole modifiche strutturali e di compatibilità per generare ed elaborare correttamente le richieste che rispettano la struttura JSON FIDO2 richiesta.

Questo aggiornamento del server ha comportato diversi aggiustamenti tecnici specifici:

1. Conversione della codifica:il server converte la codifica URL Base64 (di uso comune in WebAuthn per campi come gli ID credenziali) in codifica Base64 standard prima di archiviare i dati pertinenti. Lo snippet seguente mostra come un rawId può 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 del 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 è in linea con le aspettative delle API interne esistenti di Zoho. L'esempio seguente illustra parte della logica di conversione applicata ai dati client prima che vengano elaborati dal server:

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 gli utenti e preferenze di autenticazione

Una parte centrale della strategia di Zoho per le passkey prevedeva di incoraggiare l'adozione da parte degli utenti, fornendo al contempo flessibilità per allinearsi ai diversi requisiti organizzativi. Ciò è stato ottenuto grazie a un'attenta progettazione dell'interfaccia utente e ai controlli delle norme.

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 e obbligatorio per l'intera organizzazione. Quando questo criterio è attivato, 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, il controllo rimane in mano ai singoli utenti. Possono scegliere il metodo di autenticazione preferito durante l'accesso, selezionando tra 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 sia per Android che per iOS). Gli utenti possono configurare comodamente le proprie passkey all'interno dell'app in qualsiasi momento, semplificando la transizione.
  • Accesso coerente:il supporto delle passkey è stato implementato in tutti i principali punti di contatto con gli utenti, garantendo che questi possano registrarsi e autenticarsi utilizzando le passkey tramite:
  • L'app mobile Zoho OneAuth (Android e iOS).
  • La pagina account web di Zoho.

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

Impatto sulla velocità di sviluppo 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 di autenticazione e API, con conseguente integrazione più rapida, da mesi a settimane, e un minor numero di errori di implementazione. Insieme, queste modifiche hanno 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 drastici della velocità
    • Accesso due 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 app di autenticazione.
  • Costi di assistenza ridotti
    • Riduzione delle richieste di assistenza relative alle password, in particolare per le password dimenticate.
    • Costi inferiori associati all'autenticazione a due fattori basata su SMS, in quanto gli utenti esistenti possono eseguire l'onboarding direttamente con le passkey.
  • Forte adozione da parte degli utenti e sicurezza avanzata:
    • 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, ogni giorno un numero maggiore di utenti usufruisce di una maggiore sicurezza contro 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 federato in un'unica interfaccia.
  • Garantisci la coerenza della codifica dei dati durante la migrazione da altre soluzioni di autenticazione FIDO:
    • Assicurati di gestire la 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 errori imprevisti.
  • Informa gli utenti sulle opzioni di recupero della passkey:
    • Evita 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 accesso riuscito 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 Android Credential Manager, offrono una soluzione di autenticazione potente e unificata che migliora la sicurezza e semplifica l'esperienza utente. Le passkey riducono significativamente i rischi di phishing, furto di credenziali e accessi non autorizzati. Invitiamo gli sviluppatori a provare l'esperienza nella loro app e a offrire l'autenticazione più sicura ai loro utenti.

Inizia a utilizzare le passkey e Gestore delle credenziali

Prova le passkey e Gestore delle credenziali su Android utilizzando il nostro codice campione pubblico.

In caso di domande o problemi, puoi comunicarcelo tramite lo strumento di monitoraggio dei problemi relativi alle credenziali Android.

Scritto da:

Continua a leggere