Questa pagina è stata tradotta automaticamente. Leggi la versione originale in inglese qui.

Cheatsheet Passkeys. Guide pratiche, pattern di distribuzione e KPI per programmi passkey.
isConditionalMediationAvailable() deve essere chiamato prima di avviare qualsiasi flusso di Conditional
UI per prevenire errori visibili all'utente su browser o dispositivi non supportati.autocomplete="username webauthn" su un campo di input HTML segnala al
browser di mostrare le passkey insieme ai suggerimenti per le password nel menu a discesa del riempimento automatico.mediation: "conditional" nella chiamata a navigator.credentials.get()
attiva il riempimento automatico delle passkey senza interrompere gli utenti con una finestra di dialogo modale bloccante.AbortController è richiesto per annullare le richieste di Conditional UI in corso perché
i menu a discesa di riempimento automatico, a differenza dei prompt modali, non dispongono di un pulsante di annullamento integrato.Con la rapida adozione delle passkey (e del protocollo WebAuthn sottostante), l'autenticazione è diventata più sicura e intuitiva per molti utenti. Uno dei progressi più evidenti delle passkey è stata l'integrazione della Conditional UI, spesso denominata "riempimento automatico passkey" o Mediazione Condizionale (di seguito manterremo il termine Conditional UI).
Nonostante la sua recente introduzione e la continua adozione da parte dei browser, c'è una notevole lacuna nella documentazione tecnica e nei consigli di implementazione per la Conditional UI. Questo articolo mira a colmare tale lacuna spiegando cos'è la Conditional UI, come funziona e come affrontare le sfide comuni durante la sua implementazione.
La Conditional UI rappresenta una nuova modalità per i processi di login tramite passkey / WebAuthn. Mostra selettivamente le passkey in un'interfaccia utente (UI) solo quando un utente ha una credenziale rilevabile (chiave residente), che è un tipo di passkey, registrata presso la relying party (il servizio online) e memorizzata nel suo autenticatore di un dispositivo (ad es. laptop, smartphone). Le passkey vengono visualizzate in un menu a discesa di selezione che si mescola con le password riempite automaticamente, fornendo una transizione senza interruzioni tra i sistemi di password tradizionali e l'avanzata autenticazione tramite passkey, in quanto gli utenti vedono entrambe nello stesso contesto. Questo approccio intelligente assicura che gli utenti non siano sopraffatti da opzioni inutili e possano navigare nel processo di login in modo più fluido.
Igor Gjorgjioski
Head of Digital Channels & Platform Enablement, VicRoads
We hit 80% mobile passkey activation across 5M+ users without replacing our IDP.
See how VicRoads scaled passkeys to 5M+ users — alongside their existing IDP.
Read the case studyLe basi della Conditional UI si fondano su tre pilastri principali:
Iscriviti al nostro Substack sulle passkey per le ultime novità.
Di seguito, forniamo una ripartizione passo dopo passo delle singole fasi di un intero flusso della Conditional UI:
In generale, il flusso di processo della Conditional UI può essere suddiviso in due fasi. Durante la fase di caricamento della pagina, la logica della Conditional UI avviene in background, mentre nella fase operativa dell'utente, l'utente deve attivamente fare qualcosa.
isConditionalMediationAvailable() per rilevare se l'attuale combinazione di browser e dispositivo
supporta la Conditional UI. Il processo continua solo se la risposta è true,
altrimenti il processo della Conditional UI viene interrotto.credentials.get() con le PublicKeyCredentialRequestOptions
ricevute e
la proprietà mediation impostata su conditional, si avvia il processo per l'autenticazione
locale sul dispositivo.Seguendo questo flusso di processo, la Conditional UI offre un'esperienza di autenticazione fluida e intuitiva per l'utente.
Per far funzionare la Conditional UI, devono essere considerati alcuni aspetti generali:
Entra nella nostra community passkeys per aggiornamenti e supporto.
Per far funzionare la Conditional UI sul lato client, devono essere soddisfatti i seguenti requisiti:
isConditionalMediationAvailable() e verificare la disponibilità tecnica
della Conditional UI (vedi sotto per
maggiori dettagli).Per far funzionare la Conditional UI, devono essere soddisfatti alcuni requisiti anche sul lato server:
Dal rilascio ufficiale della Conditional UI alla fine del 2022 e dalle precedenti versioni beta, abbiamo testato e lavorato intensamente con essa. Di seguito, vogliamo condividere con voi suggerimenti pratici che ci hanno aiutato durante l'implementazione della Conditional UI.
Sperimenta i flussi passkey nel Passkeys Debugger.
Un esempio di codice completo e minimalista per un metodo di Conditional UI si presenterebbe in questo modo:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Conditional UI</title> </head> <body> <input type="text" id="username" autocomplete="username webauthn" /> <script> async function passkeyLogin() { try { // recupera le opzioni della richiesta (inclusa la challenge) dal server WebAuthn let options = await WebAuthnClient.getPublicKeyRequestOptions(); const credential = await navigator.credentials.get({ publicKey: options.publicKeyCredentialRequestOptions, mediation: "conditional", }); const userData = await WebAuthnClient.sendSignedChallenge(credential); window.location.href = "/logged-in"; } catch (error) { console.log(error); } } passkeyLogin(); </script> </body> </html>
Implementare il rilevamento della Conditional UI che assicuri che essa venga impiegata solo quando la
combinazione di dispositivo e browser corrente la supporta. Questo dovrebbe funzionare senza presentare errori
visibili all'utente in assenza di supporto per la Conditional UI. Incorporare il metodo
isConditionalMediationAvailable() all'interno dell'interfaccia utente risolve questo
problema. Se il supporto per la Conditional UI è presente, il processo di login della Conditional UI può essere
avviato.
// source: https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredential/isConditionalMediationAvailable#examples // Availability of `window.PublicKeyCredential` means WebAuthn is usable. if (window.PublicKeyCredential && PublicKeyCredential.isConditionalMediationAvailable) { // Check if conditional mediation is available. const isCMA = await PublicKeyCredential.isConditionalMediationAvailable(); if (isCMA) { // Call WebAuthn authentication start endpoint let options = await WebAuthnClient.getPublicKeyRequestOptions(); const credential = await navigator.credentials.get({ publicKey: options.publicKeyCredentialRequestOptions, mediation: "conditional", }); /* ... */ } }
Il campo di input dovrebbe ricevere un token HTML autofill per webauthn. Questo segnala al client di inserire le passkey nella richiesta in corso. Oltre alle passkey, potrebbero essere mostrati anche altri valori di riempimento automatico. Questi token di riempimento automatico possono essere accoppiati con altri token esistenti, ad es.:
autocomplete="username webauthn": Oltre a visualizzare le passkey, questo suggerisce anche
il riempimento automatico del nome utente.autocomplete="current-password webauthn": Oltre a visualizzare le passkey, questo
richiede anche il riempimento automatico della password.<label for="name">Nome utente:</label> <input type="text" name="name" autocomplete="username webauthn" /> <label for="password">Password:</label> <input type="password" name="password" autocomplete="current-password webauthn" />
Per maggiori dettagli, consigliamo di leggere questo post del blog che fornisce maggiori informazioni sui token di riempimento automatico / completamento automatico per passkey e password.
Per recuperare le passkey disponibili dopo aver ricevuto l'oggetto PublicKeyCredentialRequestOptions,
dovrebbe essere chiamata la funzione navigator.credentials.get() (che serve sia
passkey che password). L'oggetto PublicKeyCredentialRequestOptions deve avere il parametro
mediation impostato su conditional per attivare la Conditional UI sul client. Per i casi
in cui si desidera invece un prompt per la passkey modale, vedere la
mediazione immediata.
const credential = await navigator.credentials.get({ publicKey: options.publicKeyCredentialRequestOptions, mediation: "conditional", });
Se non vi è alcuna passkey disponibile, o se l'utente ignora le passkey suggerite e inserisce la propria e-mail, il flusso della Conditional UI viene interrotto. Ciò sottolinea l'importanza di supportare sempre anche il normale processo di login tramite passkey / WebAuthn via finestra modale.
Un punto critico da sottolineare qui è la potenziale necessità di interrompere una richiesta di Conditional UI in corso. A differenza delle esperienze modali, i menu a discesa per il riempimento automatico mancano di un pulsante di annullamento. Secondo la progettazione di WebAuthn, solo una singola richiesta attiva di credenziali dovrebbe essere in corso in un dato momento. Lo standard WebAuthn suggerisce l'uso di un AbortController per annullare un processo WebAuthn, applicabile sia ai processi di login regolari che a quelli tramite Conditional UI (vedere qui per i dettagli).
Nella telemetria di produzione, questo percorso di annullamento è spesso un esito previsto del flusso di controllo, non un guasto del sistema. Se si osservano volumi elevati di errori, è necessario classificare i casi attesi da quelli imprevisti per tipo di operazione e tempistiche prima di trattarli come regressioni (vedere gli errori WebAuthn).
Il processo di login tramite Conditional UI si attiva non appena un utente accede alla pagina. L'attività
iniziale dovrebbe essere quella di creare un oggetto AbortController con ambito globale.
Questo agirà come segnale per il client per terminare la richiesta di riempimento automatico,
in particolare se l'utente decide di eseguire il normale processo di login tramite passkey.
Assicurarsi che l'AbortController possa essere invocato da altre funzioni e che venga ripristinato se
il processo della Conditional UI deve essere riavviato. Utilizzare la proprietà signal all'interno della chiamata
navigator.credentials.get(), incorporando il segnale dell'AbortController come
suo valore. Questo segnala alla funzione per passkey / WebAuthn che la richiesta deve essere
interrotta se il segnale viene annullato. Ricordarsi di impostare un nuovo AbortController ogni volta che
si attiva la Conditional UI. L'utilizzo di un AbortController già annullato porterà all'annullamento
immediato della funzione passkey / WebAuthn. I restanti passaggi sono in linea con un normale
processo di login tramite passkey. Di seguito viene riportato
un esempio di codice dei passaggi menzionati:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Conditional UI</title> </head> <body> <input type="text" id="username" autocomplete="username webauthn" /> <script> async function passkeyLogin() { try { // recupera le opzioni della richiesta (inclusa la challenge) dal server WebAuthn let options = await WebAuthnClient.getPublicKeyRequestOptions(); const credential = await navigator.credentials.get({ publicKey: options.publicKeyCredentialRequestOptions, mediation: "conditional", }); const userData = await WebAuthnClient.sendSignedChallenge(credential); window.location.href = "/logged-in"; } catch (error) { console.log(error); } } passkeyLogin(); </script> </body> </html>
In assenza di supporto per la Conditional UI, indirizzare gli utenti verso il normale processo di login tramite passkey. Offrire questo percorso è importante per gli utenti che si affidano a chiavi di sicurezza hardware (ad es. YubiKey) o per coloro che sono costretti a utilizzare chiavi non residenti o credenziali non rilevabili a causa dei vincoli dell'autenticatore.
Scopri quante persone usano davvero le passkey.
Quando si sviluppa un'app nativa, ad es. per iOS o Android, funziona anche la Conditional UI. Non importa se la si implementa nativamente in Flutter, Kotlin o Swift, o se si decide di utilizzare Chrome Custom Tabs CCT o SFSafariViewController o SFAuthenticationSession / ASWebAuthenticationSession. Entrambi gli approcci supportano la Conditional UI.
In generale, non abbiamo trovato quasi nessuna documentazione su come implementare il supporto alla Conditional UI per le app iOS. Tuttavia, durante le nostre ricerche, abbiamo scoperto due modi per aggiungere il supporto alla Conditional UI in un'app iOS, poiché anche l'esperienza utente sarà diversa.
Tipo A: Sovrapposizione / Popup su quasi tutto lo schermo
Il primo tipo A mostra una sovrapposizione o popup che si estende su quasi l'intero schermo. Qui, verranno visualizzate tutte le passkey disponibili per questa relying party. Un esempio noto che implementa la Conditional UI in questo modo è KAYAK. L'overlay o popup appare automaticamente quando l'utente apre la schermata corretta.
Tipo B: Riempimento automatico da tastiera
Il secondo tipo B visualizza una passkey adatta nella sezione di riempimento automatico della
tastiera (dove vengono suggerite anche le password). Cliccando sul valore suggerito
verrà eseguita l'autenticazione tramite Face ID e si accederà all'applicazione.
Nell'attuale versione dell'app iOS del pannello per sviluppatori Corbado, lo abbiamo implementato in questo
modo (si veda il messaggio Accedi con passkey per <relying party ID> insieme
al nome utente WebAuthn). Per comparire, l'utente deve toccare all'interno del campo di input:
Questa funzione di riempimento automatico della passkey nella sezione della tastiera potrebbe presentare dei problemi quando iOS è stato appena installato poiché, apparentemente, si verifica in background un qualche tipo di memorizzazione nella cache che ricerca tutte le passkey disponibili per questa relying party.
Cliccando sull'icona a forma di chiave alla destra della passkey suggerita si accede alla nota schermata per la scelta di password o passkey in iOS:
Si prega di notare che non abbiamo trovato alcuna documentazione ufficiale e le nostre considerazioni si basano su nostre esperienze ed ipotesi piuttosto che su prove concrete della corretta implementazione.
In Android, la situazione per la Conditional UI è un po' più chiara, in quanto esiste un solo tipo per la Conditional UI e il riempimento automatico delle passkey che sfrutta l'API Android Credential Manager (vedere la documentazione qui). Poiché i provider su Android possono differire, monitorare gli errori relativi alle passkey nel Credential Manager separatamente rispetto ai pattern di errore WebAuthn validi solo per il browser.
L'apertura della pagina in cui è implementata la Conditional UI mostra la seguente schermata, in cui si troveranno diversi modi per accedere:
Facendo clic su Altri accessi salvati si ottengono ulteriori opzioni tra cui scegliere per l'accesso (inclusa l'autenticazione tra dispositivi e la selezione di una piattaforma di sincronizzazione passkey diversa, ad es. Samsung Pass o 1Password):
Per illustrare come appare la Conditional UI all'utente finale, abbiamo aggiunto diversi screenshot di un menu di riempimento automatico in Conditional UI utilizzando https://passkeys.eu.
Prova le passkey in una demo live.
Diamo un'occhiata ad alcuni scenari comuni in applicazioni di vita reale.
Se non è stata salvata alcuna passkey per un sito, la Conditional UI si comporterà in modo diverso a seconda del browser e del sistema operativo.
Su Chrome su macOS, facendo clic nel campo di input, viene visualizzato un menu a discesa per il riempimento automatico vuoto:
Su Safari su macOS, non viene visualizzato alcun menu a discesa: solo un'icona sottile nel campo di input:
Su Android o iOS, l'interfaccia di riempimento automatico appare solo se l'utente tocca il campo e il sistema operativo trova delle credenziali corrispondenti.
Questa variabilità è intenzionale ed è parte integrante del modello di privacy di WebAuthn: i siti web non possono rilevare se l'utente possiede una passkey, a meno che non ne selezioni attivamente una.
Se un utente ha installato più provider di passkey (ad es. Portachiavi iCloud, Google Password Manager, 1Password), il browser o il sistema operativo passerà solitamente al gestore delle credenziali principale dell'utente come impostazione predefinita.
Per un elenco di diversi provider di passkey o gestori delle credenziali che supportano le passkey, ti consigliamo di dare un'occhiata al seguente collegamento GitHub.
Su Android, il Credential Manager espone diversi provider, come Samsung Pass o 1Password.
Su iOS, l'icona della chiave apre l'elenco completo delle passkey provenienti da diverse fonti.
Come app o sito web, non puoi controllare quale gestore delle credenziali viene utilizzato: il sistema operativo gestisce quella scelta per preservare la privacy dell'utente.
Le passkey, con la loro funzionalità di Conditional UI per il riempimento automatico, rappresentano il nuovo modo di autenticarsi online. Poiché stiamo passando a un'era in cui le password vengono sempre più sostituite dalle passkey, la necessità di meccanismi di transizione solidi e intuitivi è innegabile. Questo articolo ha aiutato a capire come implementare correttamente la Conditional UI, di grande aiuto nel processo di transizione, e a quali aspetti prestare particolare attenzione.
Corbado è la Authentication Intelligence Platform per i team CIAM che gestiscono l'autenticazione consumer su larga scala. Ti aiutiamo a vedere ciò che i log IDP e gli strumenti di analytics generici non mostrano: quali dispositivi, versioni di OS, browser e gestori di credenziali supportano i passkey, perché gli enrollment non si trasformano in login, dove il flusso WebAuthn fallisce e quando un aggiornamento di OS o browser interrompe silenziosamente il login — tutto senza sostituire Okta, Auth0, Ping, Cognito o il tuo IDP interno. Due prodotti: Corbado Observe aggiunge osservabilità per i passkey e qualsiasi altro metodo di login. Corbado Connect introduce passkey gestiti con analytics integrato (insieme al tuo IDP). VicRoads gestisce i passkey per oltre 5M di utenti con Corbado (+80 % di attivazione passkey). Parla con un esperto di Passkey →
Chiama PublicKeyCredential.isConditionalMediationAvailable() e procedi solo se
restituisce true. Questo controllo previene errori visibili all'utente su combinazioni
di browser e dispositivi non supportate. Il metodo dovrebbe essere valutato a ogni
caricamento della pagina prima di chiamare navigator.credentials.get() con
mediation: "conditional".
Gli autenticatori memorizzano dati specifici dell'utente come nome e nome visualizzato solo per le chiavi residenti (credenziali rilevabili). Le chiavi non residenti non conservano queste informazioni, quindi il menu di riempimento automatico non può popolare i dettagli dell'account affinché l'utente possa selezionarli.
Il comportamento varia a seconda della piattaforma. Chrome su macOS mostra un menu a discesa di riempimento automatico vuoto, Safari su macOS mostra solo una piccola icona nel campo di input, e su Android o iOS l'interfaccia di riempimento automatico appare solo se il sistema operativo trova credenziali corrispondenti dopo che l'utente ha toccato il campo. Questa variabilità è intenzionale e fa parte del modello di privacy di WebAuthn: i siti web non possono rilevare se esiste una passkey a meno che l'utente non ne selezioni attivamente una.
Crea un AbortController con ambito globale e passa il suo segnale a
navigator.credentials.get(). Chiama .abort() sul controller quando l'utente
avvia un flusso di login modale. Istanzia sempre un nuovo AbortController ogni
volta che la Conditional UI si riavvia, perché riutilizzare un controller già
annullato causa la cancellazione immediata della richiesta WebAuthn.
La Conditional UI funziona in entrambe le app native per iOS e Android. iOS supporta due varianti: un popup in sovrimpressione a schermo intero e un suggerimento di riempimento automatico sulla tastiera. Android utilizza l'API Credential Manager, che può mostrare passkey di vari provider come Samsung Pass o 1Password.
Articoli correlati
Indice