Questo articolo spiega come implementare le passkey nelle app native (iOS + Android). Scoprirai quale tipo di WebView è consigliato per l'autenticazione con passkey.

Vincent
Created: June 20, 2025
Updated: December 11, 2025

Passkeys Series: Native Apps
See the original blog version in English here.
+70-page Enterprise Passkey Whitepaper:
Learn how leaders get +80% passkey adoption. Trusted by Rakuten, Klarna & Oracle
| Approccio | Adozione | Creare passkey | Usare passkey | Gestire passkey | Complessità tecnica | Supporto OAuth |
|---|---|---|---|---|---|---|
| Implementazione nativa | 🟢🟢🟢 | Adozione elevata, UX migliore, biometria fluida | Autenticazione istantanea e silenziosa | Controllo nativo completo | Medio-Alta | Richiede un flusso separato |
| System WebView | 🟢🟢 | Buona adozione, esperienza simile al browser | UX standard del browser, portachiavi condiviso | Gestione basata su browser | Bassa | Eccellente |
| Embedded WebView | 🟢 | Adozione più bassa, richiede più configurazione | Supporto nativo iOS e Android (WebKit 1.12.1+), nessuna Conditional UI | Controllo limitato | Medio-Alta | N/A |
Nota: System WebView e Embedded WebView sono spesso combinati, dove il System WebView gestisce il login (con condivisione automatica delle credenziali), e poi l'Embedded WebView renderizza la gestione delle passkey nelle impostazioni.
Fattori chiave per la decisione:
Le moderne piattaforme mobili offrono tre approcci distinti per integrare le passkey nella tua app nativa, ognuno con diversi compromessi in termini di esperienza utente, complessità tecnica e compatibilità con OAuth:
Implementazione nativa: Costruisci flussi di passkey direttamente nella tua app usando le API della piattaforma (iOS AuthenticationServices, Android Credential Manager). Offre la migliore esperienza utente con un'autenticazione biometrica fluida, ma richiede uno sforzo di implementazione tecnica medio-alto.
System WebView: Usa il componente browser della piattaforma (iOS ASWebAuthenticationSession / SFSafariViewController, Android Chrome Custom Tabs) per gestire l'autenticazione. Eccellente per i flussi di login basati su OAuth e condivide le credenziali con il browser di sistema.
Embedded WebView: Incorpora una web view personalizzabile (iOS WKWebView, Android WebView) all'interno della tua app per riutilizzare l'autenticazione web con una struttura di app nativa. Offre un aspetto simile al nativo senza barre degli URL e pieno controllo sull'interfaccia della web view. Richiede una configurazione aggiuntiva, incluse autorizzazioni ed entitlements (iOS), e la configurazione della WebView con AndroidX WebKit 1.12.1+ (Android) per abilitare la funzionalità passkey.
La scelta giusta dipende dall'architettura di autenticazione della tua app, dall'uso di provider OAuth, dal controllo che desideri avere sull'interfaccia utente e dal fatto che tu stia costruendo un'app native-first o riutilizzando componenti web.
Un'implementazione nativa delle passkey offre l'esperienza utente ottimale, con flussi di autenticazione integrati direttamente nell'interfaccia della tua app tramite API specifiche della piattaforma. Gli utenti beneficiano di dialoghi nativi della piattaforma, verifica biometrica fluida e tempi di login più rapidi possibili.
Quando scegliere l'implementazione nativa:
preferImmediatelyAvailableCredentials per
visualizzare automaticamente l'overlay delle passkey
quando sono disponibili, offrendo l'esperienza di login più rapida senza richiedere
l'inserimento di un identificatoreVantaggio chiave: preferImmediatelyAvailableCredentials()
Le implementazioni native possono sfruttare preferImmediatelyAvailableCredentials() per
creare un
overlay automatico delle passkey
che appare immediatamente all'avvio dell'app quando sono disponibili. Questo flusso senza
nome utente offre l'esperienza di login più rapida possibile: gli utenti vedono le loro
passkey all'istante senza dover prima inserire un identificatore. Questa funzionalità è
esclusiva delle implementazioni native e non è disponibile nelle varianti WebView.
Mentre le implementazioni WebView possono usare la Conditional UI (suggerimenti di passkey nei campi di input), l'overlay automatico nativo offre una UX superiore con tassi di utilizzo delle passkey più alti, poiché l'autenticazione inizia immediatamente all'avvio dell'app.
Panoramica dei requisiti tecnici:
L'integrazione nativa delle passkey richiede un trust crittografico tra la tua app e il dominio web. Senza di esso, il sistema operativo rifiuterà tutte le operazioni WebAuthn. Requisiti chiave:
/.well-known/Il vantaggio principale: le passkey create sul tuo sito web funzionano perfettamente nella tua app e viceversa.
L'implementazione nativa delle passkey su iOS coinvolge il framework AuthenticationServices di Apple, che fornisce un'API per le operazioni WebAuthn:
Componenti chiave:
ASAuthorizationController: Gestisce il flusso di autenticazioneASAuthorizationPlatformPublicKeyCredentialProvider: Crea le richieste di passkeyConsigli per lo sviluppo
?mode=developer all'URL del tuo AASA per forzare un recupero
aggiornatoL'implementazione nativa delle passkey su Android utilizza l'API Credential Manager (o la più vecchia API FIDO2 per la retrocompatibilità):
Componenti chiave:
CredentialManager: API centrale per tutte le operazioni sulle credenzialiCreatePublicKeyCredentialRequest: Per la registrazione di passkeyGetCredentialRequest: Per l'autenticazione con passkeyNota: Android attualmente non dispone dei suggerimenti da tastiera della Conditional UI di iOS nelle app native (sebbene la Conditional UI funzioni nelle app web)
L'implementazione nativa delle passkey presenta sfide importanti e lezioni apprese: l'integrazione a livello di sistema operativo può far emergere problemi su diversi dispositivi e versioni del sistema operativo.
Sebbene sia possibile implementare le passkey utilizzando le API grezze della piattaforma, gli SDK appositamente creati accelerano significativamente lo sviluppo gestendo la complessità di WebAuthn, i casi limite e fornendo telemetria integrata. Gli SDK offrono anche interfacce simulabili per i test unitari (fondamentale poiché non è possibile testare la biometria nei simulatori).
Raccomandazione: Per le implementazioni native, consigliamo di utilizzare gli SDK di Corbado (SDK Passkey per iOS Swift, SDK Passkey per Android Kotlin) che gestiscono i numerosi casi limite scoperti attraverso le implementazioni in produzione, forniscono telemetria aggiuntiva e strumenti di test.
Igor Gjorgjioski
Head of Digital Channels & Platform Enablement, VicRoads
Corbado proved to be a trusted partner. Their hands-on, 24/7 support and on-site assistance enabled a seamless integration into VicRoads' complex systems, offering passkeys to 5 million users.
Passkey che milioni di persone adottano, velocemente. Inizia con la piattaforma di adozione di Corbado.
Inizia la prova gratuitaLe System WebView utilizzano il componente browser nativo della piattaforma per gestire l'autenticazione all'interno della tua app. A differenza delle implementazioni completamente native, le System WebView mostrano contenuti web utilizzando il browser di sistema effettivo (Safari su iOS, Chrome su Android), mantenendo cookie condivisi, credenziali salvate e i familiari indicatori di sicurezza del browser.
Quando scegliere System WebView:
Vantaggi chiave:
Componenti della piattaforma:
ASWebAuthenticationSession (consigliato per flussi di autenticazione) o
SFSafariViewController (navigazione generale)Grandi aziende come Google e GitHub hanno adottato questo approccio per aggiungere il login con passkey alle loro app mobili tramite overlay WebView su pagine di autenticazione web esistenti. Questo funziona bene quando una ricostruzione completa dell'autenticazione nativa non è immediatamente fattibile.
iOS fornisce due componenti principali di System WebView for l'autenticazione:
ASWebAuthenticationSession (Consigliato per l'autenticazione):
SFSafariViewController (Navigazione generale):
| Caratteristica | ASWebAuthenticationSession | SFSafariViewController |
|---|---|---|
| Caso d'uso principale | Flussi di autenticazione | Navigazione web generale |
| OAuth/OIDC | Eccellente | Buono |
| Supporto Passkey | Sì | Sì |
| Personalizzazione | Limitata | Minima |
Se la tua app usa un login basato su OAuth, ASWebAuthenticationSession è la scelta
consigliata poiché è progettata specificamente per scenari di autenticazione e offre il
miglior equilibrio tra sicurezza ed
esperienza utente.
I Chrome Custom Tabs (CCT) offrono un'esperienza di autenticazione basata su Chrome all'interno della tua app:
Caratteristiche principali:
Integrazione OAuth: I Chrome Custom Tabs sono l'equivalente Android dell'ASWebAuthenticationSession di iOS, fornendo un eccellente supporto OAuth e mantenendo l'accesso alle passkey memorizzate.
Le Embedded WebView offrono pieno controllo sul rendering dei contenuti web all'interno della tua app, permettendo la manipolazione diretta di cookie, sessioni e navigazione senza la barra dell'URL. Tuttavia, questo controllo comporta requisiti tecnici aggiuntivi per abilitare la funzionalità passkey.
Quando scegliere Embedded WebView:
Contesto importante:
Molte app utilizzano un approccio ibrido: System WebView gestisce l'autenticazione OAuth iniziale (dove le passkey funzionano senza problemi), per poi passare a Embedded WebView dopo l'autenticazione per gestire le passkey nelle impostazioni. Le sfide sorgono quando si tenta di utilizzare le passkey direttamente all'interno delle Embedded WebView.
Requisiti tecnici:
Le Embedded WebView richiedono una configurazione aggiuntiva rispetto alle System WebView:
Componenti della piattaforma:
WKWebViewandroid.webkit.WebViewCompromessi:
Quando si implementano le passkey tramite WebView, è fondamentale comprendere la distinzione tra System WebView e Embedded WebView. I tre approcci sopra descritti (Implementazione nativa, System WebView e Embedded WebView) servono ciascuno a casi d'uso diversi.
Su iOS, hai diverse opzioni per visualizzare contenuti web in-app:
Su Android, le scelte principali sono:
android.webkit.WebView), che è
essenzialmente un mini browser che può essere incorporato nelle tue attività. È
altamente personalizzabile ma viene eseguito nel processo della tua app.Nelle sezioni seguenti, approfondiremo questi tipi di WebView per iOS e Android e discuteremo quale potrebbe essere più adatto per i flussi di autenticazione con passkey.
La piattaforma di Apple offre le tre opzioni di WebView elencate sopra. La tua scelta influenzerà la fluidità con cui le passkey possono essere utilizzate all'interno dell'app:
Per testare il diverso comportamento delle WebView in iOS, raccomandiamo l'app WebView - WKWebView and UIWebView rendering.
WKWebView è un componente WebView versatile per iOS. Gli sviluppatori possono incorporare una WKWebView per renderizzare contenuti web con un alto grado di controllo sull'interfaccia e sul comportamento. WKWebView utilizza lo stesso motore di rendering di Safari, quindi è molto performante e supporta le moderne funzionalità web. In teoria, WKWebView può gestire WebAuthn (e quindi le passkey) se configurato correttamente, ma nota che alcune funzionalità avanzate del browser potrebbero essere limitate per sicurezza. Una cosa da tenere d'occhio è che WKWebView per impostazione predefinita non condivide cookie o dati del portachiavi con Safari Mobile. Gli utenti potrebbero dover effettuare nuovamente il login perché la loro sessione WebView è isolata dalla sessione di Safari. Inoltre, poiché il contenuto di WKWebView può essere completamente personalizzato dall'app, l'utente non vede una barra degli indirizzi o l'interfaccia di Safari – il che è ottimo per il branding, ma significa che l'utente ha meno indizi per verificare la legittimità della pagina (una preoccupazione per l'anti-phishing). Alcune app hanno persino abusato di WKWebView per iniettare script o alterare contenuti (ad es. è stato notato che TikTok inietta JS di tracciamento tramite il suo browser in-app), quindi bisogna fare attenzione a usare WKWebView in modo sicuro e affidabile per l'utente.
SFSafariViewController offre un'esperienza Safari in-app. Quando apri un URL con SFSafariViewController, è quasi come aprirlo nel browser Safari reale, tranne che l'utente rimane all'interno dell'interfaccia della tua app. Il vantaggio per le passkey è significativo: poiché è essenzialmente Safari, il Portachiavi iCloud dell'utente e le passkey salvate sono accessibili. Nota che i cookie non sono condivisi su iOS 11+. Ciò significa che se l'utente ha già una passkey per il tuo sito, Safari può trovarla e persino visualizzare l'autocompletamento della Conditional UI per un facile login. SFSafariViewController è meno personalizzabile (non puoi cambiarne molto la barra degli strumenti), ma gestisce automaticamente molte funzioni di sicurezza e privacy. La barra degli URL è mostrata, completa dell'icona del lucchetto per l'HTTPS, il che dà agli utenti la sicurezza di essere sul dominio corretto. In generale, SFSafariViewController è considerato più sicuro di una WKWebView grezza e più semplice da implementare (Apple lo fornisce come un componente pronto all'uso). Il compromesso principale è che sacrifichi un po' di controllo sull'aspetto e la sensazione. Per un flusso di autenticazione, questo è solitamente accettabile. La priorità qui è la sicurezza e la facilità di login, in cui SFSafariViewController eccelle utilizzando il contesto di Safari.
| WKWebView | SFSafariViewController | |
|---|---|---|
| Esperienza utente | - Sensazione nativa: Gli utenti potrebbero sentire che il contenuto web è una parte nativa dell'app perché gli sviluppatori possono personalizzare l'aspetto per abbinarlo al design dell'app. - Autocompletamento: È possibile l'autocompletamento con dati da Safari | - Fluida: Esperienza utente fluida utilizzando le impostazioni di Safari dell'utente, garantendo una navigazione web coerente tra app nativa e browser. |
| Esperienza sviluppatore | - Altamente personalizzabile: Ampia personalizzazione e configurazione disponibili - Flessibile: Molte API per interagire con i contenuti web | - Mediamente personalizzabile: Opzioni di personalizzazione limitate, specialmente rispetto a WKWebView, - Semplice: Più semplice da implementare rispetto a WKWebView |
| Prestazioni | - Piuttosto lenta: A seconda dell'implementazione e del contenuto web, le velocità di caricamento possono essere ottimizzate, ma potrebbero essere ancora più lente rispetto a SFSafariViewController a causa dell'elaborazione aggiuntiva di funzionalità e interazioni personalizzate. | - Piuttosto veloce: Offre tipicamente prestazioni migliori poiché sfrutta il motore di Safari, ottimizzato per velocità ed efficienza, fornendo tempi di caricamento rapidi per le pagine web. |
| Fiducia e riconoscimento | - Visualizzazione dell'URL non richiesta: WKWebView spesso non mostra l'URL, rendendo più difficile per gli utenti verificare la pagina web. Potenziale per app malevole di imitare questo comportamento e fare phishing di credenziali. | - Esperienza simile al browser: Renderizza le pagine web usando Safari, fornendo un'esperienza "simile al browser". Gli utenti possono vedere l'URL e accedere alle funzioni di autocompletamento di Safari, infondendo potenzialmente più fiducia grazie all'interfaccia familiare. |
| Isolamento | - Separati: Cookie e sessioni sono separati da Safari; gli utenti non saranno automaticamente loggati in una WKWebView. | - Separati: Anche cookie e sessioni sono separati da Safari; gli utenti non saranno automaticamente loggati neanche in SFSafariViewController. |
| Vulnerabilità | - Sicuro: Intrinsecamente sicuro grazie al sandboxing delle app di Apple, ma il comportamento e la sicurezza dipendono dall'implementazione dell'app. Potenziali vulnerabilità se non implementato correttamente. | - Più sicuro: Beneficia delle funzionalità di sicurezza integrate di Safari, inclusi avvisi anti-phishing e contro siti web malevoli. Generalmente considerato più sicuro per la visualizzazione di contenuti web rispetto a WKWebView grazie a queste funzionalità e alla familiarità dell'utente con Safari. |
| Altro | - Funzionalità non disponibili: Alcune funzionalità del browser (es., WebAuthn) potrebbero non essere completamente accessibili a causa di problemi di sicurezza e del fatto che WKWebView viene eseguito nel contesto dell'applicazione. - Iniezione di JavaScript: Alcune app, come TikTok, iniettano JavaScript di tracciamento nella loro WKWebView in-app, o limitano il controllo dell'utente (es. Facebook) - Problemi di privacy: Più feedback dalla community riguardo alla privacy | - Nessuna iniezione di JavaScript: Non consente l'esecuzione di JavaScript dall'app, migliorando sicurezza e privacy. Inoltre, non supporta avvisi o conferme JavaScript, influenzando potenzialmente l'esperienza utente su determinate pagine web. - Modalità Lettura: Offre una modalità lettura per una versione pulita e facile da leggere degli articoli. |
SFAuthenticationSession / ASWebAuthenticationSession – Queste classi (la seconda è il nome più recente e compatibile con Swift) sono costruite specificamente per flussi di login come OAuth o OpenID Connect. Quando hai bisogno di autenticare un utente tramite una pagina web (magari verso un IdP esterno), queste sessioni sono la scelta consigliata su iOS. Sono molto simili a SFSafariViewController in quanto utilizzano il browser Safari e condividono cookie/dati con Safari. La differenza chiave è che SFAuthenticationSession chiederà sempre all'utente se l'app vuole autenticarsi usando una pagina web (per la consapevolezza dell'utente) e utilizzerà automaticamente la sessione Safari esistente dell'utente, se disponibile.
Il vantaggio è un'esperienza SSO fluida – se l'utente è già loggato al provider in Safari, questa sessione può usare quel cookie per evitare un altro login. Per le passkey, questo è importante perché significa che qualsiasi credenziale passkey memorizzata in Safari/iCloud Keychain può essere usata anche qui. La guida ufficiale di Apple è di usare ASWebAuthenticationSession per qualsiasi cosa che assomigli a un flusso di login. I pro sono una maggiore privacy (la tua app non vede mai le credenziali o i cookie, se ne occupa Safari) e il supporto SSO integrato. Il contro è che è limitato ai flussi di autenticazione (non lo useresti per renderizzare semplicemente contenuti web arbitrari nella tua app). In sintesi, se scegli un approccio WebView su iOS, ASWebAuthenticationSession è tipicamente la scelta migliore per implementare le passkey perché è sicuro, condivide lo stato con Safari ed è costruito appositamente per l'autenticazione.
Su Android, la decisione sulla WebView è tra la classica WebView e i Chrome Custom Tabs:
Per testare il diverso comportamento delle WebView in Android, raccomandiamo l'app WebView vs Chrome Custom Tabs.
Android WebView (android.webkit.WebView) è un componente che ti permette di incorporare pagine web nel layout della tua attività. È simile a WKWebView in quanto ti dà il pieno controllo: puoi intercettare la navigazione, iniettare JavaScript, personalizzare l'interfaccia, ecc. Viene anche eseguito all'interno del processo della tua app. Usare una WebView per le passkey significa che la tua app carica la tua pagina di login web, e quella pagina può avviare una cerimonia di passkey WebAuthn. Le moderne Android WebView supportano WebAuthn (a condizione che l'implementazione della WebView del dispositivo sia aggiornata tramite Android System WebView o il componente Chrome). Una considerazione importante: per impostazione predefinita, una Android WebView non condivide cookie o credenziali memorizzate con il browser Chrome dell'utente. Quindi qualsiasi passkey creata o usata nella WebView potrebbe non essere nota a Chrome, e viceversa. Questo isolamento può essere buono per la sicurezza (la tua app non può leggere i cookie del browser), ma potrebbe costringere gli utenti a effettuare nuovamente il login se si sono già autenticati in Chrome. Un altro problema è la fiducia. Una WebView semplice non mostra l'URL o l'icona del lucchetto SSL, quindi gli utenti devono fidarsi completamente della tua app che non li stia ingannando con il phishing. Google ha persino proibito l'uso di WebView per gli accessi OAuth di Google a causa dei potenziali rischi di phishing. Dal punto di vista delle prestazioni, le WebView vanno bene, ma possono essere più lente o più intensive in termini di memoria rispetto all'utilizzo del browser predefinito dell'utente, specialmente se si caricano pagine pesanti.
Chrome Custom Tabs (CCT) sono un approccio ibrido. Permettono alla tua app di aprire una pagina renderizzata da Chrome che sembra parte della tua app. Puoi personalizzare il colore della barra degli strumenti, aggiungere un logo dell'app, ecc., ma il contenuto è renderizzato da Chrome in un processo separato. Per le passkey, i CCT hanno diversi vantaggi: condividono i cookie e le credenziali dell'utente con Chrome, il che significa che se l'utente ha una passkey salvata tramite Chrome (Google Password Manager), il Custom Tab può accedervi. L'utente vedrà anche l'URL effettivo e gli indicatori di sicurezza, il che costruisce fiducia. Le prestazioni sono spesso migliori – Chrome può essere "riscaldato" in background per un caricamento più rapido. E, cosa importante, la sicurezza è forte: poiché è essenzialmente l'app di Chrome, funzionalità come Google Safe Browsing proteggono la sessione, e la tua app non può iniettare script arbitrari nella pagina (prevenendo alcuni attacchi).
Lo svantaggio è che richiede che l'utente abbia Chrome (o un browser supportato) installato e aggiornato. La maggior parte degli utenti Android ce l'ha, ma su alcuni dispositivi in certe regioni, questo potrebbe essere un problema. Nel complesso, se scegli un approccio web incorporato su Android, i Chrome Custom Tabs sono raccomandati per i flussi di passkey, poiché offrono un buon equilibrio tra integrazione e sicurezza. In effetti, sono analoghi in molti modi a SFSafariViewController/ASWebAuthSession di iOS – sfruttando il browser predefinito per l'autenticazione.
(A parte: WKWebView vs SFSafariViewController di Apple e WebView vs CCT di Android hanno molti paralleli. Sia Safari VC che Chrome Tabs condividono lo stato del browser e offrono una sicurezza migliore, mentre WKWebView/Android WebView danno più controllo ma isolano il contenuto web. Per le passkey, la condivisione dello stato (cookie, archivi di credenziali) è solitamente desiderabile in modo che la passkey possa essere accessibile e creata senza problemi.)
| Caratteristica | WebView | Chrome Custom Tab |
|---|---|---|
| Esperienza utente | - Flessibilità: Offre un ricco set di API per interagire con i contenuti web e gestire le interazioni dell'utente, inclusa la gestione di dialoghi JavaScript e richieste di autorizzazione. - Coerenza: Gestire un'esperienza utente coerente, specialmente con contenuti web variegati, può essere una sfida. | - Funzionalità del browser: Condivide funzionalità come Risparmio dati e Autocompletamento sincronizzato tra i dispositivi. - Pulsante Indietro: Consente agli utenti di tornare facilmente all'app con un pulsante Indietro integrato. - Dipendenza: Dipende dall'app Chrome, che potrebbe non essere disponibile o aggiornata su tutti i dispositivi degli utenti. - Reindirizzamento al browser: Alcune funzionalità potrebbero reindirizzare gli utenti all'app Chrome, potenzialmente interrompendo l'esperienza utente. - Custom Tabs parziali: Solo una parte dello schermo può essere utilizzata per il Chrome Custom Tab mentre il resto mostra l'app nativa. - Side-sheet: In modalità orizzontale e su dispositivi a schermo grande, il Chrome Custom Tab viene visualizzato solo su un lato dello schermo, mentre il resto dello schermo mostra l'app nativa. |
| Esperienza sviluppatore | - Altamente personalizzabile: Offre ampie opzioni/esigenze di personalizzazione. - Interattività: Fornisce numerose API per interagire con i contenuti web e gestire le interazioni dell'utente. | - Personalizzabile: Consente la personalizzazione del colore della barra degli strumenti, del pulsante di azione, della barra degli strumenti inferiore, delle voci di menu personalizzate e delle animazioni di entrata/uscita. - Callback: Invia un callback all'applicazione in caso di navigazione esterna. - Funzionalità di sicurezza: Fornisce funzionalità pronte all'uso, eliminando la necessità di gestire richieste, concessioni di autorizzazioni o archivi di cookie. |
| Prestazioni | - Prestazioni mediocri: Potrebbe non offrire lo stesso livello di prestazioni dei Chrome Custom Tabs (CCT). | - Pre-riscaldamento: Include il pre-riscaldamento del browser in background e il caricamento speculativo degli URL per migliorare il tempo di caricamento della pagina. - Priorità: Impedisce che le app che avviano un Custom Tab vengano terminate durante il loro utilizzo elevando la loro importanza al livello "foreground". |
| Fiducia e riconoscimento | - URL e SSL non visibili: L'URL e le informazioni SSL non sono intrinsecamente visibili in una WebView. A meno che lo sviluppatore dell'app non implementi queste funzionalità, gli utenti non sapranno se si trovano sul sito web corretto o su uno di phishing. | - URL e SSL visibili: Utilizza il browser Chrome effettivo per renderizzare le pagine. Gli utenti possono vedere l'URL e il certificato SSL (che indica se la connessione è sicura). Questo può dare agli utenti la certezza di non trovarsi su un sito di phishing. |
| Isolamento | - Esegue nel processo dell'app: Se un'app ha una vulnerabilità che consente l'esecuzione di codice malevolo, c'è il rischio che la WebView possa essere compromessa. Tuttavia, anche la WebView riceve aggiornamenti, ma il suo comportamento e la sua sicurezza possono dipendere maggiormente dall'app che la utilizza. - Nessuna condivisione di cookie/sessioni: Non condivide cookie o sessioni con il browser principale del dispositivo, offrendo isolamento ma richiedendo potenzialmente agli utenti di effettuare nuovamente il login. | - Esegue nel processo di Chrome: Essendo parte di Chrome, i Custom Tabs vengono eseguiti nello stesso processo e hanno gli stessi aggiornamenti di sicurezza e le stesse funzionalità di Chrome. - Jar di cookie e modello di autorizzazioni condivisi: Assicura che gli utenti non debbano effettuare nuovamente l'accesso ai siti o concedere nuovamente le autorizzazioni. - Impostazioni e preferenze di Chrome: Utilizza le impostazioni e le preferenze di Chrome. |
| Vulnerabilità | - Callback per rubare le credenziali: Le potenziali vulnerabilità includono che a volte è richiesto JavaScript, il che apre la porta ad altre app per eseguire codice malevolo, come la registrazione di callback che tentano di intercettare nomi utente e password. - Phishing: Inoltre, un'app malevola potrebbe aprire un'altra pagina web che imita il flusso di Link in un tentativo di phishing. | - Google Safe Browsing: Utilizza il Safe Browsing di Google per proteggere sia l'utente che il dispositivo da siti pericolosi. - Decorazione sicura del browser: Assicura che l'utente veda sempre l'URL esatto con cui sta interagendo e possa visualizzare le informazioni sul certificato del sito web, riducendo il rischio di phishing. Inoltre, i custom tabs non consentono l'iniezione di JavaScript. |
| Altro | - Google ha vietato le WebView per il login degli utenti agli account Google |
Indipendentemente dall'approccio di implementazione scelto, devono essere soddisfatti determinati requisiti tecnici per abilitare la funzionalità passkey. Questa sezione fornisce una guida completa sulla configurazione dei file di associazione well-known, degli entitlements di iOS e della configurazione della WebView di Android.
Nota sui dispositivi gestiti: Il comportamento delle passkey cambia significativamente sui dispositivi gestiti in cui le policy di Mobile Device Management (MDM) controllano l'archiviazione delle credenziali. Per testare le passkey su dispositivi gestiti, vedere Passkey su dispositivi iOS e Android gestiti.
I flussi nativi e Embedded WebView richiedono file di associazione per stabilire un trust crittografico tra la tua app e il dominio web. System WebView (ASWebAuthenticationSession) e Chrome Custom Tabs non richiedono l'associazione app-sito.
Il file AASA stabilisce la connessione tra la tua app iOS e il tuo dominio web, consentendo alle passkey di funzionare su entrambe le piattaforme.
Posizione del file: https://tuodominio.com/.well-known/apple-app-site-association
Requisiti di configurazione:
/.well-known/apple-app-site-association sul tuo dominioapplication/json.well-knownEsempio di file AASA:
{ "webcredentials": { "apps": ["TEAMID123.com.example.app"] } }
Caching e test AASA:
Apple mette in cache aggressivamente i file AASA (fino a 24-48 ore) utilizzando una CDN, il che può frustrare lo sviluppo e il testing. Per bypassare la cache durante lo sviluppo:
?mode=developer al tuo dominio associato in Xcode⚠️ Importante: NON usare ?mode=developer nelle versioni di produzione. Questo
parametro è solo per lo sviluppo; usarlo in produzione impedirà a iOS di rilevare
correttamente il tuo file AASA, interrompendo la funzionalità delle passkey.
Validazione: Usa il validatore AASA di Apple per verificare la tua configurazione.
Android utilizza i Digital Asset Links per verificare la relazione tra la tua app e il tuo sito web.
Posizione del file: https://tuodominio.com/.well-known/assetlinks.json
Requisiti di configurazione:
/.well-known/assetlinks.json sul tuo dominioapplication/jsonEsempio di file assetlinks.json:
[ { "relation": [ "delegate_permission/common.handle_all_urls", "delegate_permission/common.get_login_creds" ], "target": { "namespace": "android_app", "package_name": "com.example.app", "sha256_cert_fingerprints": [ "AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99" ] } } ]
Validazione: Usa il generatore di Digital Asset Links di Google per creare e verificare la tua configurazione.
Le app iOS richiedono entitlements adeguati per accedere alla funzionalità passkey. I requisiti differiscono leggermente in base al tuo approccio di implementazione.
Il file degli entitlements (spesso chiamato Runner.entitlements nelle app
Flutter o LaTuaApp.entitlements nei progetti iOS
nativi) definisce autorizzazioni e capacità speciali concesse dal sistema di Apple. Per le
passkey, questo file configura i Domini Associati.
Posizione del file: Tipicamente nel tuo progetto Xcode in
ios/Runner/Runner.entitlements
L'implementazione nativa e la Embedded WebView richiedono la capacità Domini Associati per collegare la tua app al tuo dominio web. La System WebView (ASWebAuthenticationSession) non richiede questo poiché viene eseguita nel contesto di Safari.
Configurazione in Xcode:
webcredentials:Esempio di configurazione:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.developer.associated-domains</key> <array> <string>webcredentials:tuodominio.com</string> <string>webcredentials:sottodominio.tuodominio.com</string> </array> </dict> </plist>
| Approccio | Domini Associati Richiesti | Configurazione aggiuntiva |
|---|---|---|
| Implementazione nativa | Sì | Implementazione dedicata |
| System WebView | Non richiesto | La configurazione web predefinita funziona |
| Embedded WebView | Sì | Richiede la configurazione di AndroidX WebKit 1.12.1+ |
Domini multipli: Se la tua app deve funzionare con più domini, potresti aver bisogno di Related Origin Requests (ROR).
Le Embedded WebView di Android hanno ottenuto il supporto nativo a WebAuthn con AndroidX WebKit 1.12, eliminando la necessità di codice bridge JavaScript personalizzato. La System WebView (Chrome Custom Tabs) non richiede alcuna configurazione: le credenziali funzionano automaticamente.
Requisiti:
Implementazione:
import androidx.webkit.WebSettingsCompat import androidx.webkit.WebViewFeature // Controlla se l'autenticazione web è supportata if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) { // Abilita l'autenticazione web WebSettingsCompat.setWebAuthenticationSupport( webView.settings, WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP ) // Abilita JavaScript webView.settings.javaScriptEnabled = true }
Punti chiave:
WebViewFeature.WEB_AUTHENTICATION in fase di esecuzionemediation:"conditional" (autocompletamento passkey
nei campi di input) non funziona in Embedded WebViewNote sulla versione:
Prima di AndroidX WebKit 1.12.0, il supporto nativo a WebAuthn non esisteva in Embedded WebView. I team dovevano:
Se devi supportare versioni Android più vecchie o dispositivi senza APK della WebView aggiornati, consulta la guida all'integrazione di Credential Manager WebView di Android per l'approccio con codice bridge. Tuttavia, raccomandiamo vivamente di utilizzare l'approccio nativo con WebKit 1.12.1+ per le app moderne.
Raccomandazione: Utilizzare il supporto nativo WebAuthn con AndroidX WebKit 1.12.1+. Se non disponibile in fase di esecuzione, fare fallback su Chrome Custom Tabs che fornisce un eccellente supporto alle passkey con credenziali condivise.
Quando si implementano le passkey in app native, è necessario stabilire una fiducia tra l'app e il/i dominio/i web. Questa sezione spiega come gestire domini singoli, domini multipli correlati (ROR) e come verificare che i file di associazione well-known siano configurati correttamente.
Per le app che utilizzano un singolo dominio (es. kayak.com), sono necessari:
webcredentials:kayak.comRelated Origins (ROR) è una
funzionalità WebAuthn che consente a un singolo set di passkey di funzionare su più domini
correlati (es. kayak.com, kayak.de, kayak.co.uk).
ROR utilizza l'endpoint
/.well-known/webauthn su ogni sito per definire le
origini correlate, NON i file
AASA o assetlinks.
Punti chiave:
/.well-known/webauthn con l'elenco delle
origini correlateEsempio di configurazione:
Se la tua app funziona con kayak.com e kayak.de, entrambi i domini devono:
Prima di andare online, verifica che i tuoi file well-known siano configurati correttamente e accessibili. Apple e Google forniscono URL di test basati su CDN per controllare la disponibilità dei file:
| Dominio | Verifica AASA Apple | Verifica Digital Asset Links Google |
|---|---|---|
| kayak.com | Testa file AASA Controlla se la CDN di Apple può recuperare il tuo file | Testa assetlinks.json Verifica se Google può accedere ai tuoi asset links |
| kayak.de | Testa file AASA Controlla se la CDN di Apple può recuperare il tuo file | Testa assetlinks.json Verifica se Google può accedere ai tuoi asset links |
Utilizzo di questi URL di test:
?nocache=1 di Apple forza un recupero aggiornato, bypassando la cache
della CDNkayak.com o kayak.de con il tuo/i tuo/i dominio/i negli schemi URL sopraAttenzione nei test: Assicurati che tutti i domini abbiano file well-known configurati correttamente. Un file mancante o mal configurato su qualsiasi dominio può interrompere la funzionalità passkey per quel dominio.
Maggiori informazioni: WebAuthn Relying Party ID nelle App Native
Scegliere il giusto approccio di implementazione dipende dall'architettura di autenticazione della tua app, dai requisiti OAuth e dalla necessità di controllo della sessione. Usa questo albero decisionale per determinare il percorso migliore.
Inizia con queste domande chiave:
La tua app utilizza un login basato su OAuth (OAuth2, OIDC, provider di social login)?
ASWebAuthenticationSessionVuoi riutilizzare l'autenticazione web in un'interfaccia simile a quella nativa (senza barra URL, pieno controllo UI)?
WKWebView + entitlements Associated DomainsWebView + configurazione AndroidX WebKit 1.12.1+Stai costruendo una nuova app nativa o hai schermate di login native?
Hai un'autenticazione web esistente che vuoi riutilizzare?
Ecco come si comporta ogni approccio rispetto a dimensioni chiave:
| Approccio | Creare passkey | Usare passkey | Gestire passkey | Complessità tecnica | Supporto OAuth | Tempo di configurazione |
|---|---|---|---|---|---|---|
| Implementazione nativa | Adozione elevata Biometria fluida, UX migliore | Istantaneo, silenziosopreferImmediatelyAvailableCredentials abilita overlay automatico all'avvio dell'app | Controllo nativo completo Integrazione con le impostazioni dell'app | Medio-Alta API specifiche della piattaforma | Richiede implementazione di un flusso OAuth separato | Settimane o mesi |
| System WebView | Buona adozione Esperienza simile al browser, familiare | UX standard del browser Conditional UI nei campi di input, portachiavi condiviso | Basata su browser Gli utenti gestiscono tramite browser | Bassa Codice nativo minimo | Eccellente Costruito per OAuth | Giorni o settimane |
| Embedded WebView | Adozione più bassa Richiede configurazione | Supporto nativo WebAuthn WebKit 1.12.1+, no Conditional UI | Controllo limitato Nessuna integrazione nativa | Medio-Alta Configurazione WebView + autorizzazioni | Richiede configurazione | 1-2 settimane |
Spiegazione delle dimensioni:
Raccomandato: System WebView
Se la tua app si autentica tramite OAuth2, OIDC o provider di social login (Google, GitHub, Microsoft, ecc.), System WebView è la scelta ottimale:
ASWebAuthenticationSession è progettato per i flussi OAuthEsempio: App di viaggi come kayak.com e kayak.de usano OAuth per l'autenticazione. System WebView permette loro di mantenere la loro infrastruttura OAuth esistente aggiungendo il supporto alle passkey tramite le loro pagine di autenticazione web.
Raccomandato: Approccio ibrido
Usa System WebView per l'autenticazione OAuth iniziale, poi Embedded WebView per le sessioni post-autenticazione:
Quando usarlo: App che si autenticano tramite OAuth ma che poi devono visualizzare contenuti web autenticati dove è richiesta la manipolazione diretta della sessione.
Raccomandato: Implementazione nativa
Stai costruendo da zero o hai schermate native? Scegli l'approccio completamente nativo:
preferImmediatelyAvailableCredentials per visualizzare un
overlay automatico delle passkey all'avvio dell'app -
esclusivo delle implementazioni native e che fornisce i più alti
tassi di conversionePer nuove app: Raccomandiamo vivamente di costruire un login nativo fin dal primo giorno. Ti prepara per una UX ottimale ed evita future migrazioni da WebView a nativo.
Raccomandato: Migrazione graduale
Questo approccio graduale permette miglioramenti incrementali senza interrompere gli utenti esistenti.
| Requisito | Nativo | System WebView | Embedded WebView |
|---|---|---|---|
| File well-known (AASA/assetlinks) | Richiesto | Non richiesto | Richiesto |
| iOS Associated Domains | Richiesto | Non richiesto | Richiesto |
| Libreria Android WebKit | Non applicabile | Non richiesto | Richiesto (1.12.1+) |
| Relying Party ID | Deve corrispondere al dominio | Deve corrispondere al dominio | Deve corrispondere al dominio |
Vedi la Sezione 5 per istruzioni dettagliate sulla configurazione.
Testare le passkey in app native richiede un approccio strutturato e multi-livello. Segui la piramide dei test: test unitari (logica isolata), test di integrazione (cerimonia WebAuthn su simulatori/emulatori) e test di sistema (end-to-end su dispositivi fisici).
Categorie di test essenziali:
Per una guida completa ai test che include strategie di automazione, problemi specifici della piattaforma e una checklist pre-lancio completa, consulta la nostra guida dedicata: Testare i flussi di passkey in app native iOS e Android.
Considera di suggerire agli utenti di creare passkey dopo un login tradizionale riuscito (password, OAuth). Questo approccio di conversione graduale:
Esempio: Dopo il login OAuth tramite System WebView, mostra un prompt nativo: "Abilitare un login più veloce con Face ID?" Se accettato, crea la passkey tramite la pagina web caricata in System WebView.
Decidere come implementare le passkey - tramite implementazione nativa, System WebView o Embedded WebView - è una scelta di progettazione cruciale che impatta sicurezza, esperienza utente e complessità di sviluppo. Non esiste una risposta valida per tutti.
Per le app basate su OAuth: System WebView (ASWebAuthenticationSession, Chrome Custom Tabs) è il punto di partenza raccomandato. Fornisce un eccellente supporto OAuth, uno sforzo di implementazione minimo e la condivisione automatica delle credenziali.
Per le app native-first: Passa al nativo il prima possibile. Un login nativo con
passkey offre la UX più fluida con funzionalità esclusive come
preferImmediatelyAvailableCredentials, che abilita un
overlay automatico delle passkey all'avvio dell'app -
qualcosa che le implementazioni WebView non possono fornire. Con iOS e Android che ora
offrono un supporto di prim'ordine per le passkey, i successi nel mondo reale dimostrano
un'alta adozione. Gli strumenti (inclusi SDK open-source e librerie di piattaforma) sono
maturati per rendere l'integrazione nativa realizzabile in tempi ragionevoli. Sebbene sia
necessario essere consapevoli delle policy di gestione dei dispositivi, della
sincronizzazione cross-device e dei provider di terze parti, queste sfide possono essere
gestite con un'attenta ingegnerizzazione e test. Il risultato è un login dell'app che
delizia gli utenti con la sua facilità e velocità, migliorando significativamente la
sicurezza.
Per i requisiti dei frame Embedded WebView: Embedded WebView è comunemente usato in due scenari reali. Primo, le app basate su OAuth usano spesso System WebView per il flusso di login iniziale, per poi passare a Embedded WebView per renderizzare le opzioni di gestione delle passkey nelle schermate delle impostazioni dove è necessario il controllo della sessione - sebbene alcune app semplifichino mantenendo System WebView per entrambi i flussi. Secondo, le app che avevano già incorporato il loro flusso di autenticazione in frame WebView prima di adottare le passkey continuano questo schema per coerenza. Embedded WebView con supporto nativo WebAuthn (AndroidX WebKit 1.12.1+) richiede configurazione e setup (permessi, entitlements, impostazioni della WebView) ma non necessita più di codice bridge JavaScript personalizzato. Nota che la Conditional UI non è supportata in Embedded WebView. Scegli questo approccio quando mantieni schemi di autenticazione incorporati esistenti o quando hai bisogno di controllo su sessione/cookie per le schermate post-autenticazione.
In definitiva, le passkey nelle app native rappresentano un enorme passo avanti sia nella comodità dell'utente che nella sicurezza. Che siano implementate tramite approccio nativo, System WebView o Embedded WebView, eliminano i rischi di phishing e l'onere della gestione delle password per i tuoi utenti. Implementazioni reali come l'integrazione delle passkey nell'app nativa di VicRoads dimostrano che gli approcci native-first offrono la più alta adozione e soddisfazione degli utenti quando eseguiti correttamente con funzionalità come gli overlay automatici delle passkey. Seguendo le migliori pratiche per un'autenticazione user-friendly e scegliendo l'approccio di implementazione che si adatta all'architettura della tua app - native-first per nuove app, System WebView per flussi OAuth, o Embedded WebView per schemi incorporati esistenti - puoi offrire login senza password e biometrici che realizzano veramente la visione delle passkey: un'autenticazione semplice, sicura e piacevole per tutti.
Se le passkey non funzionano nella tua app nativa, controlla questi problemi comuni per ogni approccio di implementazione:
application/json.well-knownhttps://tuo-dominio.com (non app://)webcredentials:tuodominio.comASWebAuthenticationSession (raccomandato) o SFSafariViewController?mode=developer durante lo sviluppo (rimuovi per la produzione)WebViewFeature.WEB_AUTHENTICATIONsetWebAuthenticationSupport() con
WEB_AUTHENTICATION_SUPPORT_FOR_APP"NotAllowedError: The request is not allowed by the user agent or the platform in the current context"
setWebAuthenticationSupport()Nessun prompt di passkey appare
?mode=developer su iOS per i test, verifica
il tipo di WebViewPer un debug dettagliato, consulta il nostro articolo sugli ID di Relying Party nelle app native.
SDK Nativi di Corbado:
Documentazione della Piattaforma:
Strumenti di Validazione:
Passkeys Series: Native Apps
Related Articles
Passkey Tutorial: How to Implement Passkeys in Web Apps
Vincent - December 7, 2023
The High-Level Architecture of an Integrated Passkey Flow
Janina - December 21, 2022
Table of Contents