Questa pagina è stata tradotta automaticamente. Leggi la versione originale in inglese qui.
| Approccio | Adozione | Creazione di passkey | Uso delle passkey | Gestione delle passkey | Complessità tecnica | Supporto OAuth |
|---|---|---|---|---|---|---|
| Implementazione nativa | 🟢🟢🟢 | Alta adozione, migliore UX, biometria fluida | Autenticazione istantanea e silenziosa | Pieno controllo nativo | 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 | 🟢 | Minore adozione, richiede più configurazione | Supporto nativo iOS e Android (WebKit 1.12.1+), no Conditional UI | Controllo limitato | Medio-Alta | N/A |
Nota: System e Embedded WebView sono spesso combinati: System WebView gestisce il login (con condivisione automatica delle credenziali), mentre Embedded WebView esegue il rendering della gestione delle passkey nelle impostazioni.
Fattori decisionali chiave:
Le moderne piattaforme mobili offrono tre approcci distinti per integrare le passkey nella tua app nativa, ciascuno con diversi compromessi per l'esperienza utente, la complessità tecnica e la compatibilità OAuth:
Implementazione nativa: Costruisci flussi per 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 un impegno tecnico di implementazione 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 uno scheletro di app nativa. Offre un aspetto nativo senza barra degli URL e pieno controllo sull'interfaccia utente della web view. Richiede configurazioni aggiuntive tra cui permessi ed entitlement (iOS) e configurazione di WebView con AndroidX WebKit 1.12.1+ (Android) per abilitare la funzionalità delle passkey.
La scelta giusta dipende dall'architettura di autenticazione della tua app, se usi provider OAuth, quanto controllo ti serve sull'interfaccia utente e se stai costruendo native-first o riutilizzando componenti web.
Whitepaper Passkey enterprise. Guide pratiche, pattern di distribuzione e KPI per programmi passkey.
Articoli recenti
♟️
Perché hai bisogno dell'Osservabilità dell'Autenticazione per il CIAM
🔑
Le Device Bound Session Credentials (DBSC) spiegate
📖
WebAuthn Relying Party ID (rpID) e Passkey: Domini e App Native
♟️
Strategia Passkey: Perché la Tua Implementazione Passkey Fallirà
♟️
Problemi del Day 2 delle passkey: 5 rischi dopo il lancio
Un'implementazione nativa delle passkey fornisce un'esperienza utente ottimale, con flussi di autenticazione costruiti direttamente nell'interfaccia utente della tua app utilizzando API specifiche della piattaforma. Gli utenti beneficiano di finestre di dialogo native della piattaforma, verifica biometrica fluida e tempi di login più veloci possibili.
Quando scegliere l'implementazione nativa:
preferImmediatelyAvailableCredentials per
mostrare automaticamente l'overlay delle passkey
quando le passkey sono disponibili, fornendo l'esperienza di login più veloce senza
richiedere l'inserimento di identificatoriVantaggio chiave: preferImmediatelyAvailableCredentials()
Le implementazioni native possono sfruttare preferImmediatelyAvailableCredentials() per
creare un
overlay automatico per le passkey
che appare immediatamente all'avvio dell'app quando le passkey sono disponibili. Questo
flusso senza username offre l'esperienza di login più veloce possibile: gli utenti vedono
le loro passkey istantaneamente senza inserire prima un identificatore. Questa capacità è
esclusiva delle implementazioni native e non è disponibile nelle varianti WebView.
Il diagramma di seguito illustra come l'autenticazione nativa offra un percorso utente più rapido rispetto all'approccio Conditional UI di WebView:
L'overlay automatico nativo fornisce una UX superiore con tassi di utilizzo delle passkey più elevati poiché l'autenticazione inizia immediatamente all'avvio dell'app, mentre le implementazioni WebView richiedono che gli utenti interagiscano prima con i campi di input.
Panoramica dei requisiti tecnici:
L'integrazione nativa delle passkey richiede una fiducia crittografica tra la tua app e il dominio web. Senza di essa, 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 per le passkeySuggerimenti per lo sviluppo
?mode=developer al tuo URL AASA per forzare recuperi
aggiornatiL'implementazione nativa delle passkey su Android utilizza l' API Credential Manager (o la precedente API FIDO2 per retrocompatibilità):
Componenti chiave:
CredentialManager: API centrale per tutte le operazioni sulle credenzialiCreatePublicKeyCredentialRequest: Per la registrazione delle passkeyGetCredentialRequest: Per l'autenticazione con passkeyNota: Al momento Android non dispone dei suggerimenti da tastiera Conditional UI di iOS nelle app native (sebbene la Conditional UI funzioni nelle web app)
L'implementazione nativa delle passkey presenta importanti sfide e lezioni apprese: l'integrazione a livello di sistema operativo può far emergere problemi tra diversi dispositivi e versioni del sistema operativo.
Mentre puoi implementare le passkey utilizzando API di piattaforma raw, SDK appositamente realizzati accelerano significativamente lo sviluppo gestendo la complessità di WebAuthn, i casi limite e fornendo telemetria integrata. Gli SDK offrono anche interfacce mockabili per gli unit test (cruciale poiché non puoi testare la biometria negli emulatori).
Raccomandazione: Per le implementazioni native, raccomandiamo l'uso degli SDK Corbado (iOS Swift Passkey SDK, Android Kotlin Passkey SDK) che gestiscono i numerosi casi limite scoperti tramite distribuzioni in produzione, forniscono telemetria aggiuntiva e strumenti di testing.
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 System WebView usano il componente browser nativo della piattaforma per gestire l'autenticazione all'interno della tua app. A differenza delle implementazioni completamente native, le System WebView visualizzano contenuti web usando l'effettivo browser di sistema (Safari su iOS, Chrome su Android), mantenendo cookie condivisi, credenziali salvate e gli indicatori di sicurezza familiari del browser.
Quando scegliere System WebView:
Vantaggi chiave:
Componenti di piattaforma:
ASWebAuthenticationSession (consigliato per flussi auth) o
SFSafariViewController (navigazione generale)Grandi aziende come Google e GitHub hanno adottato questo approccio per aggiungere il login tramite passkey alle loro app mobili tramite overlay WebView sulle pagine di autenticazione web esistenti. Questo funziona bene quando non sono immediatamente fattibili ricostruzioni di autenticazione completamente native.
iOS fornisce due componenti principali di System WebView per l'autenticazione:
ASWebAuthenticationSession (Consigliato per l'Autenticazione):
SFSafariViewController (Navigazione Generale):
| Funzionalità | ASWebAuthenticationSession | SFSafariViewController |
|---|---|---|
| Caso d'uso primario | Flussi di autenticazione | Navigazione web generale |
| OAuth/OIDC | Eccellente | Buona |
| Supporto Passkey | Sì | Sì |
| Personalizzazione | Limitata | Minima |
Se la tua app usa login basato su OAuth, ASWebAuthenticationSession è la scelta
raccomandata poiché è specificamente progettato per gli scenari di autenticazione e offre
il miglior equilibrio tra sicurezza ed esperienza utente.
Le Chrome Custom Tabs (CCT) forniscono un'esperienza di autenticazione potenziata da Chrome all'interno della tua app:
Funzionalità chiave:
Integrazione OAuth: Le Chrome Custom Tabs sono l'equivalente Android di iOS ASWebAuthenticationSession, fornendo un eccellente supporto OAuth pur mantenendo l'accesso alle passkey salvate.
Prova le passkey in una demo live.
Le Embedded WebView forniscono il pieno controllo sul rendering dei contenuti web all'interno della tua app, consentendo la manipolazione diretta di cookie, sessioni e navigazione senza barra degli URL. Tuttavia, questo controllo comporta requisiti tecnici aggiuntivi per abilitare la funzionalità delle passkey.
Quando scegliere Embedded WebView:
Contesto importante:
Molte app usano un approccio ibrido: System WebView gestisce l'autenticazione OAuth iniziale (dove le passkey funzionano perfettamente), poi passano a Embedded WebView per la fase post-autenticazione per gestire le passkey nelle impostazioni. Le sfide sorgono quando si cerca di usare le passkey direttamente all'interno delle Embedded WebView.
Requisiti tecnici:
Le Embedded WebView richiedono una configurazione aggiuntiva rispetto alle System WebView:
Componenti di piattaforma:
WKWebViewandroid.webkit.WebViewCompromessi:
Quando si implementano le passkey tramite WebView, comprendere la distinzione tra System WebView ed Embedded WebView è fondamentale. I tre approcci sopra delineati (Implementazione nativa, System WebView ed Embedded WebView) servono ciascuno casi d'uso diversi.
Su iOS, hai a disposizione più opzioni per mostrare contenuti web in-app:
Su Android, le scelte principali sono:
android.webkit.WebView), che è
essenzialmente un mini browser che può essere incorporato nelle tue activity. È
altamente personalizzabile ma viene eseguito nel processo della tua app.Nelle sezioni seguenti, approfondiremo un po' di più questi tipi di WebView per iOS e Android e discuteremo quale potrebbe essere il più adatto per i flussi di autenticazione tramite passkey.
Iscriviti al nostro Substack sulle passkey per le ultime novità.
La piattaforma di Apple offre le tre opzioni WebView sopra elencate. La tua scelta influenzerà quanto fluidamente le passkey possono essere utilizzate all'interno dell'app:
Per testare il diverso comportamento delle WebView in iOS, consigliamo l'app WebView - WKWebView and UIWebView rendering.
WKWebView è un componente WebView versatile per iOS. Gli sviluppatori possono incorporare una WKWebView per eseguire il rendering di contenuti web con un alto grado di controllo sull'UI e sul comportamento. WKWebView usa 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 tieni presente che alcune funzionalità avanzate del browser potrebbero essere limitate per motivi di sicurezza. Una cosa a cui prestare attenzione è che WKWebView di default non condivide cookie o dati del portachiavi con Mobile Safari. Gli utenti potrebbero dover accedere di nuovo 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'UI di Safari - il che è ottimo per il branding, ma significa che l'utente ha meno segnali per verificare la legittimità della pagina (una preoccupazione per l'anti-phishing). Alcune app hanno persino abusato di WKWebView per iniettare script o alterare i contenuti (ad es. è stato notato che TikTok iniettava JS di tracciamento tramite il proprio browser in-app), quindi bisogna fare attenzione a utilizzare WKWebView in un modo sicuro e affidabile per l'utente.
SFSafariViewController offre un'esperienza Safari in-app. Quando apri un URL con SFSafariViewController, è quasi come aprirlo nel vero browser Safari, tranne per il fatto che l'utente rimane all'interno dell'UI della tua app. Il vantaggio per le passkey è significativo: poiché è essenzialmente Safari, il Portachiavi di iCloud e le passkey salvate dell'utente 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'autocomplete della Conditional UI per un facile accesso. SFSafariViewController è meno personalizzabile (non puoi modificare molto la sua barra degli strumenti), ma gestisce automaticamente molte funzionalità di sicurezza e privacy. La barra degli URL viene mostrata, completa dell'icona del lucchetto per HTTPS, che dà agli utenti la sicurezza di trovarsi sul dominio corretto. In generale, SFSafariViewController è considerato più sicuro di una WKWebView grezza ed è più semplice da implementare (Apple lo fornisce come un componente pronto all'uso). Il compromesso principale è che sacrifichi un po' di controllo sul look & feel. Per un flusso di autenticazione, questo è di solito accettabile. La priorità qui è la sicurezza e la facilità di accesso, in cui SFSafariViewController eccelle utilizzando il contesto di Safari.
| WKWebView | SFSafariViewController | |
|---|---|---|
| Esperienza utente | - Sensazione nativa: Gli utenti potrebbero percepire il contenuto web come una parte nativa dell'app perché gli sviluppatori possono personalizzare il look and feel per adattarlo al design dell'app. - Riempimento automatico: È possibile il riempimento automatico con dati da Safari | - Senza interruzioni: Esperienza utente fluida usando le impostazioni 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 | - Abbastanza lenta: A seconda dell'implementazione e dei contenuti web, la velocità di caricamento può essere ottimizzata, ma potrebbe comunque essere più lenta rispetto a SFSafariViewController a causa dell'elaborazione aggiuntiva di funzioni e interazioni personalizzate. | - Abbastanza veloce: Di solito offre prestazioni migliori poiché sfrutta il motore di Safari, che è ottimizzato per velocità ed efficienza, fornendo tempi di caricamento rapidi per le pagine web. |
| Fiducia e riconoscimento | - Visualizzazione URL non richiesta: WKWebView spesso non mostra l'URL, rendendo più difficile per gli utenti verificare la pagina web. Potenziale per le app dannose di imitare questo comportamento ed eseguire il phishing delle credenziali. | - Esperienza simil-browser: Esegue il rendering delle pagine web utilizzando Safari, fornendo un'esperienza "simile al browser". Gli utenti possono vedere l'URL e accedere alle funzioni di riempimento automatico di Safari, instillando potenzialmente maggiore fiducia grazie all'interfaccia familiare. |
| Isolamento | - Separati: Cookie e sessioni sono separati da Safari; gli utenti non saranno automaticamente connessi a una WKWebView. | - Separati: Cookie e sessioni sono separati da Safari; gli utenti non saranno automaticamente connessi nemmeno a SFSafariViewController. |
| Vulnerabilità | - Sicura: Intrinsecamente sicura grazie all'app sandboxing di Apple, ma comportamento e sicurezza dipendono dall'implementazione dell'app. Potenziali vulnerabilità se non implementata correttamente. | - Più Sicura: Beneficia delle funzioni di sicurezza integrate in Safari, inclusi gli avvisi anti-phishing e sui siti web dannosi. Generalmente considerata più sicura 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 (ad 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 JavaScript: Alcune app, ad es. TikTok, iniettano JavaScript di tracciamento nella loro WKWebView in-app, o limitano il controllo utente (ad es. Facebook) - Problemi di privacy: Maggiori feedback della community riguardo alla privacy | - Nessuna iniezione JavaScript: Non consente l'esecuzione di JavaScript dall'app, migliorando sicurezza e privacy. Inoltre non supporta avvisi o conferme JavaScript, potendo influire sull'esperienza utente su determinate pagine web. - Modalità Lettura: Fornisce una modalità di lettura per una versione pulita e facile da leggere degli articoli. |
SFAuthenticationSession / ASWebAuthenticationSession – Queste classi (l'ultima essendo il nome più recente orientato a Swift) sono create appositamente per flussi di login come OAuth o OpenID Connect. Quando hai bisogno di autenticare un utente tramite una pagina web (magari a un IdP esterno), queste sessioni sono la scelta consigliata su iOS. Sono molto simili a SFSafariViewController in quanto utilizzano il browser Safari dietro le quinte e condividono cookie/archiviazione con Safari. La differenza chiave è che SFAuthenticationSession chiederà sempre all'utente se desidera che l'app si autentichi tramite una pagina web (per consapevolezza dell'utente) e utilizzerà automaticamente la sessione Safari esistente dell'utente, se disponibile.
Il vantaggio è un'esperienza SSO senza interruzioni: se l'utente è già connesso 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/Portachiavi di iCloud può essere usata anche qui. La linea guida ufficiale di Apple è quella di usare ASWebAuthenticationSession per qualsiasi cosa sembri un flusso di login. I pro sono una maggiore privacy (la tua app non vede mai le credenziali o i cookie, Safari li gestisce) e supporto SSO integrato. Il contro è che è limitata ai flussi di autenticazione (non la useresti solo per eseguire il rendering di 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é è sicura, condivide lo stato con Safari ed è appositamente creata per l'autenticazione.
Scopri quante persone usano davvero le passkey.
Su Android, la decisione relativa a WebView è tra la classica WebView e Chrome Custom Tabs:
Per testare il diverso comportamento delle WebView in Android, consigliamo 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 activity. È simile a WKWebView in quanto ti dà il pieno controllo: puoi intercettare la navigazione, iniettare JavaScript, personalizzare l'UI, ecc. Viene anche eseguito all'interno del processo della tua app. Utilizzare una WebView per le passkey significa che la tua app carica la pagina di login web, e quella pagina può avviare una cerimonia di passkey WebAuthn. La moderna Android WebView supporta WebAuthn (a condizione che l'implementazione WebView del dispositivo sia aggiornata tramite Android System WebView o il componente Chrome). Una considerazione importante: per impostazione predefinita, una WebView Android non condivide i cookie o le credenziali salvate con il browser Chrome dell'utente. Quindi qualsiasi passkey creata o utilizzata nella WebView potrebbe non essere nota a Chrome, e viceversa. Questo isolamento può essere positivo per la sicurezza (la tua app non può leggere i cookie del browser), ma potrebbe costringere gli utenti ad accedere nuovamente 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 che la tua app non li sottoponga a phishing. Google ha persino vietato l'uso di WebView per gli accessi OAuth di Google a causa dei potenziali rischi di phishing. In termini di prestazioni, le WebView vanno bene, ma possono essere più lente o utilizzare più memoria rispetto all'uso del browser predefinito dell'utente, specialmente se si caricano pagine pesanti.
Le Chrome Custom Tabs (CCT) sono un approccio ibrido. Consentono alla tua app di aprire una pagina renderizzata da Chrome che sembra far parte della tua app. Puoi personalizzare il colore della barra degli strumenti, aggiungere un logo dell'app, ecc., ma il contenuto viene renderizzato da Chrome in un processo separato. Per le passkey, le 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), la Custom Tab può accedervi. L'utente vedrà anche l'URL reale e gli indicatori di sicurezza, che costruiscono la fiducia. Le prestazioni sono spesso migliori: Chrome può essere "riscaldato" in background per un caricamento più rapido. Ed è importante che la sicurezza sia forte: poiché è essenzialmente l'app Chrome, elementi come Google Safe Browsing proteggono la sessione, e la tua app non può iniettare script arbitrari nella pagina (prevenendo certi attacchi).
Il lato negativo è che richiede che l'utente abbia Chrome (o un browser supportato) installato e aggiornato. La maggior parte degli utenti Android lo fa, ma su alcuni dispositivi in certe regioni, questo potrebbe essere un problema. Nel complesso, se opti per un approccio web integrato su Android, si raccomandano le Chrome Custom Tabs per i flussi con passkey, poiché offrono un buon equilibrio di integrazione e sicurezza. Infatti, sono per molti versi analoghe a SFSafariViewController/ASWebAuthSession di iOS: sfruttano il browser predefinito per l'autenticazione.
(Nota a margine: WKWebView di Apple vs SFSafariViewController e WebView di Android vs CCT hanno molti paralleli. Sia Safari VC che le Chrome Tabs condividono lo stato del browser e offrono una migliore sicurezza, mentre WKWebView/Android WebView danno più controllo ma isolano i contenuti web. Per le passkey, condividere lo stato (cookie, archivi credenziali) è di solito auspicabile affinché la passkey possa essere accessibile e creata senza problemi.)
| Funzionalità | WebView | Chrome Custom Tab |
|---|---|---|
| Esperienza utente | - Flessibilità: Fornisce un ricco set di API per l'interazione con i contenuti web e la gestione delle interazioni dell'utente, inclusa la gestione di finestre di dialogo JavaScript e richieste di autorizzazione. - Coerenza: Mantenere un'esperienza utente coerente, specialmente con vari contenuti web, può essere difficile. | - Funzionalità del browser: Condivide funzionalità come Risparmio dati e AutoComplete sincronizzato su tutti i dispositivi. - Pulsante Indietro: Consente agli utenti di tornare facilmente all'app con un pulsante Indietro integrato. - Dipendenza: Si affida all'app Chrome, che potrebbe non essere disponibile o aggiornata sui dispositivi di tutti gli utenti - Reindirizzamento al browser: Determinate 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 la Chrome Custom Tab mentre il resto mostra l'app nativa - Pannello laterale: In modalità orizzontale e sui dispositivi con schermo grande, la Chrome Custom Tab viene visualizzata solo su un lato dello schermo, mentre il resto mostra l'app nativa |
| Esperienza sviluppatore | - Altamente personalizzabile: Offre ampie opzioni/esigenze di personalizzazione. - Interattività: Fornisce numerose API per l'interazione con i contenuti web e la gestione delle interazioni dell'utente. | - Personalizzabile: Consente la personalizzazione del colore della barra degli strumenti, del pulsante di azione, della barra degli strumenti inferiore, degli elementi del menu personalizzati e delle animazioni di entrata/uscita. - Callback: Fornisce un callback all'applicazione al momento di una navigazione esterna. - Funzioni 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 delle 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à: Evita che le app che avviano una Custom Tab vengano espulse durante il suo utilizzo elevandone l'importanza al livello "primo piano". |
| Fiducia e riconoscimento | - URL & 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 & SSL visibili: Utilizza il vero browser Chrome per eseguire il rendering delle pagine. Gli utenti possono vedere l'URL e il certificato SSL (che indica se la connessione è sicura). Questo può dare agli utenti la sicurezza 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 dannoso, c'è il rischio che la WebView possa essere compromessa. Tuttavia, la WebView riceve anche 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 accedere di nuovo. | - Esegue nel processo di Chrome: Facendo parte di Chrome, le Custom Tabs vengono eseguite nello stesso processo e hanno gli stessi aggiornamenti e funzionalità di sicurezza di Chrome. - Vaso di cookie condiviso e modello di autorizzazioni: Assicura che gli utenti non debbano accedere nuovamente ai siti o concedere di nuovo 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 il fatto che a volte è richiesto JavaScript che apre la porta ad altre app per eseguire codice dannoso, come la registrazione di callback che tentano di intercettare nomi utente e password. - Phishing: Inoltre, un'app dannosa potrebbe aprire un'altra pagina web che imita il flusso Link in un tentativo di phishing. | - Google Safe Browsing: Utilizza 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, le custom tabs non consentono l'iniezione di JavaScript. |
| Altro | - Google ha vietato le WebView per gli utenti che accedono agli account Google |
Indipendentemente dall'approccio di implementazione scelto, devono essere soddisfatti determinati requisiti tecnici per abilitare la funzionalità delle passkey. Questa sezione fornisce una guida completa sulla configurazione dei file di associazione well-known, degli entitlement iOS e della configurazione della WebView Android.
Nota sui dispositivi gestiti: Il comportamento delle passkey cambia in modo significativo sui dispositivi gestiti dove i criteri Mobile Device Management (MDM) controllano l'archiviazione delle credenziali. Per testare le passkey su dispositivi gestiti, consulta le passkey sui dispositivi gestiti iOS e Android.
I flussi nativi e con Embedded WebView richiedono file di associazione per stabilire una fiducia crittografica 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 AASA e Test:
Apple memorizza nella cache in modo aggressivo i file AASA (fino a 24-48 ore) utilizzando una CDN, il che può frustrare lo sviluppo e i test. Per bypassare il caching 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: utilizzarlo in produzione impedirà a iOS di rilevare
correttamente il tuo file AASA, interrompendo la funzionalità delle passkey.
Convalida: Usa AASA Validator di Apple per verificare la tua configurazione.
Android usa i Digital Asset Links per verificare la relazione tra la tua app e il 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" ] } } ]
Convalida: Usa Digital Asset Links Generator di Google per creare e verificare la tua configurazione.
Le app iOS richiedono i corretti entitlement per accedere alla funzionalità delle passkey. I requisiti differiscono leggermente in base al tuo approccio di implementazione.
Il file degli entitlement (spesso denominato Runner.entitlements nelle app
Flutter o TuaApp.entitlements nei progetti iOS nativi)
definisce autorizzazioni speciali e capacità concesse dal sistema di Apple. Per le
passkey, questo file configura i Domini
associati (Associated Domains).
Posizione del file: Tipicamente nel tuo progetto Xcode in
ios/Runner/Runner.entitlements
L'implementazione nativa e la Embedded WebView richiedono la capacità Associated Domains per collegare la tua app al tuo dominio web. System WebView (ASWebAuthenticationSession) non lo richiede poiché viene eseguito 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 | Associated Domains Richiesto | Configurazione aggiuntiva |
|---|---|---|
| Implementazione nativa | Sì | Implementazione dedicata |
| System WebView | Non richiesto | La configurazione web predefinita funziona |
| Embedded WebView | Sì | Richiede configurazione AndroidX WebKit 1.12.1+ |
Domini multipli: Se la tua app deve funzionare con più domini potresti aver bisogno delle richieste di origine correlata (ROR - Related Origin Requests).
Le Embedded WebView di Android supportano le passkey tramite due approcci distinti: il nuovo approccio basato su WebKit (Sezione 5.3.1) e il vecchio approccio con bridge JavaScript (Sezione 5.3.2). System WebView (Chrome Custom Tabs) non richiede alcuna configurazione: le credenziali funzionano automaticamente.
Android fornisce esempi ufficiali per le passkey in WebView che dimostrano entrambi gli approcci di implementazione.
La moderna integrazione di WebKit con la gestione nativa delle passkey. Questo approccio fornisce supporto WebAuthn nativo senza richiedere codice bridge personalizzato.
Esempio ufficiale: Webkit WebView MainActivity
Requisiti:
Implementazione:
import androidx.webkit.WebSettingsCompat import androidx.webkit.WebViewFeature // Check if Web Authentication is supported if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) { // Enable Web Authentication WebSettingsCompat.setWebAuthenticationSupport( webView.settings, WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP ) // Enable JavaScript webView.settings.javaScriptEnabled = true }
Punti chiave:
WebViewFeature.WEB_AUTHENTICATION a runtimemediation:"conditional" (compilazione automatica
passkey nei campi di input) non funziona in Embedded WebViewNote sulla versione:
Prima di AndroidX WebKit 1.12.0, il supporto WebAuthn nativo non esisteva nella Embedded WebView. Questo vecchio approccio utilizza un bridge Web-to-Native per gestire le passkey per i dispositivi senza supporto WebAuthn nativo per la WebView.
Esempi Ufficiali:
Quando utilizzarlo: Quando si supportano versioni precedenti di Android o dispositivi con implementazioni WebView legacy.
I team dovevano o:
Per l'implementazione dettagliata, vedi Guida all'integrazione della Credential Manager WebView di Android. Tuttavia, raccomandiamo vivamente l'uso dell'approccio nativo WebKit 1.12.1+ per le app moderne.
Raccomandazione: Usa il supporto WebAuthn nativo con AndroidX WebKit 1.12.1+. Se non è disponibile a runtime, passa alle Chrome Custom Tabs che offrono un eccellente supporto alle passkey con credenziali condivise.
Quando implementi le passkey in app native, devi stabilire una fiducia tra la tua app e il dominio/i web. Questa sezione copre come gestire i domini singoli, i domini multipli correlati (ROR) e come verificare che i file di associazione well-known siano configurati correttamente.
Per le app che usano un singolo dominio (ad es. kayak.com), hai bisogno di:
webcredentials:kayak.comLe origini correlate (ROR -
Related Origins) sono una
funzionalità WebAuthn che consente a un singolo set di passkey di funzionare su più domini
correlati (ad es. kayak.com, kayak.de, kayak.co.uk). Il
ROR utilizza l' endpoint
/.well-known/webauthn su ciascun 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 passare alla produzione, verifica che i file well-known siano adeguatamente configurati e accessibili. Apple e Google forniscono URL di test basati su CDN per verificare la disponibilità dei file:
| Dominio | Verifica Apple AASA | Verifica Google Digital Asset Links |
|---|---|---|
| kayak.com | Testa file AASA Controlla se la CDN Apple può recuperare il file | Testa assetlinks.json Verifica che Google possa accedere ai tuoi asset links |
| kayak.de | Testa file AASA Controlla se la CDN Apple può recuperare il file | Testa assetlinks.json Verifica che Google possa accedere ai tuoi asset links |
Utilizzo di questi URL di test:
?nocache=1 di Apple forza il recupero aggiornato, aggirando la cache CDNkayak.com o kayak.de con il tuo/i dominio/i nei modelli URL sopraInsidia nei test: Assicurati che tutti i domini abbiano i file well-known adeguatamente configurati. Un file mancante o non configurato correttamente su qualsiasi dominio può interrompere la funzionalità delle passkey per quel dominio.
Maggiori informazioni: Relying Party ID di WebAuthn nelle app native
La scelta del giusto approccio di implementazione dipende dall'architettura di autenticazione della tua app, dai requisiti OAuth e dalla necessità di controllare le sessioni. Usa questo albero decisionale per determinare il percorso migliore da seguire.
Il seguente diagramma di flusso ti guida attraverso la selezione del giusto approccio di implementazione in base ai requisiti della tua app:
Riferimento rapido per ogni percorso:
Ecco come ogni approccio si comporta rispetto alle dimensioni chiave:
| Approccio | Creazione di passkey | Uso delle passkey | Gestione delle passkey | Complessità tecnica | Supporto OAuth | Tempo di setup |
|---|---|---|---|---|---|---|
| Implementazione nativa | Alta adozione Biometria fluida, UX migliore | Istantanea, silenziosapreferImmediatelyAvailableCredentials abilita overlay automatico all'avvio | Pieno controllo nativo Si integra con le impostazioni app | Medio-Alta API specifiche della piattaforma | Richiede l'implementazione separata del flusso OAuth | Da settimane a mesi |
| System WebView | Buona adozione Esperienza simile al browser, familiare | UX del browser standard Conditional UI nei campi di input, portachiavi condiviso | Basata su browser Gli utenti gestiscono via browser | Bassa Codice nativo minimo | Eccellente Costruito per OAuth | Da giorni a settimane |
| Embedded WebView | Adozione inferiore Richiede configurazione | Supporto WebAuthn nativo WebKit 1.12.1+, no Conditional UI | Controllo limitato Nessuna integrazione nativa | Medio-Alta Config. WebView + permessi | Richiede configurazione | 1-2 settimane |
Spiegazione delle dimensioni:
Consigliata: System WebView
Se la tua app esegue l'autenticazione tramite OAuth2, OIDC o provider di social login (Google, GitHub, Microsoft, ecc.), System WebView è la scelta ottimale:
ASWebAuthenticationSession è progettato specificamente per i flussi OAuthEsempio: App Viaggi come kayak.com e kayak.de utilizzano OAuth per l'autenticazione. La System WebView consente loro di mantenere la loro infrastruttura OAuth esistente aggiungendo il supporto passkey tramite le loro pagine di autenticazione web.
Consigliato: Approccio Ibrido
Usa System WebView per l'autenticazione OAuth iniziale, poi Embedded WebView per le sessioni post-autenticazione:
Quando utilizzarlo: App che autenticano tramite OAuth ma poi hanno bisogno di mostrare contenuti web autenticati in cui è richiesta la manipolazione diretta della sessione.
Consigliato: Implementazione nativa
Stai costruendo da zero o hai schermate native? Passa al nativo in modo completo:
preferImmediatelyAvailableCredentials per mostrare
l'overlay automatico delle passkey all'avvio dell'app -
esclusivo per le implementazioni native e in grado di fornire i tassi di conversione più
altiPer le nuove app: Si consiglia vivamente di costruire l'accesso nativo sin dal primo giorno. Ti prepara per una UX ottimale ed evita future migrazioni da WebView a nativo.
Consigliato: Migrazione graduale
Il diagramma seguente mostra il percorso di migrazione incrementale:
Ogni fase si basa sulla precedente, consentendo miglioramenti incrementali senza interrompere gli utenti esistenti.
| Requisito | Nativa | System WebView | Embedded WebView |
|---|---|---|---|
| File well-known (AASA/assetlinks) | Richiesto | Non richiesto | Richiesto |
| Associated Domains iOS | 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 a più livelli. Segui la piramide dei test: unit test (logica isolata), test di integrazione (cerimonia WebAuthn su simulatori/emutatori) e test di sistema (end-to-end su dispositivi fisici).
Categorie di test essenziali:
Per una guida completa ai test, incluse le strategie di automazione, i problemi specifici della piattaforma e una lista di controllo pre-lancio completa, consulta la nostra guida dedicata: Testing dei flussi passkey nelle app native iOS e Android.
Prendi in considerazione la possibilità di suggerire agli utenti di creare passkey dopo un login tradizionale effettuato con successo (password, OAuth). Questo approccio di conversione graduale:
Esempio: Dopo l'accesso OAuth tramite System WebView, mostra un prompt nativo: "Abilitare il login più veloce con Face ID?". Se accettato, crea la passkey tramite la pagina web caricata nella System WebView.
Decidere come implementare le passkey - tramite implementazione nativa, System WebView o Embedded WebView - è una scelta di progettazione cruciale che incide sulla sicurezza, l'esperienza utente e la 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 consigliato. Offre un eccellente supporto OAuth, uno sforzo di implementazione minimo e una condivisione automatica delle credenziali.
Per le app native-first: Passa al nativo il prima possibile. Un login nativo tramite
passkey offre la UX più fluida con funzionalità esclusive come
preferImmediatelyAvailableCredentials, che abilita
l'overlay automatico della passkey all'avvio dell'app -
qualcosa che le implementazioni WebView non possono fornire. Con iOS e Android che ora
forniscono un supporto di prim'ordine per le passkey, i successi nel mondo reale
dimostrano un'elevata adozione. Gli strumenti (inclusi SDK open-source e librerie di
piattaforma) sono maturati per rendere possibile l'integrazione nativa in tempi
ragionevoli. Sebbene si debba prestare attenzione alle politiche di gestione dei
dispositivi, alla sincronizzazione cross-device e ai provider di terze parti, queste sfide
possono essere gestite con un'ingegnerizzazione e test accurati. Il risultato è un accesso
all'app che entusiasma gli utenti con la sua facilità e velocità, migliorando al tempo
stesso significativamente la sicurezza.
Per i requisiti del frame Embedded WebView: La Embedded WebView è comunemente utilizzata in due scenari del mondo reale. In primo luogo, le app basate su OAuth spesso utilizzano la System WebView per il flusso iniziale di login, poi passano alla Embedded WebView per il rendering delle opzioni di gestione delle passkey nelle schermate delle impostazioni dove è richiesto il controllo della sessione - sebbene alcune app semplifichino ciò mantenendo la System WebView per entrambi i flussi. In secondo luogo, le app che già incorporavano il proprio flusso di autenticazione nei frame WebView prima di adottare le passkey continuano su questo modello per coerenza. L'Embedded WebView con supporto WebAuthn nativo (AndroidX WebKit 1.12.1+) richiede configurazione e impostazione (permessi, entitlement, impostazioni WebView) ma non necessita più del codice del bridge JavaScript personalizzato. Nota che la Conditional UI non è supportata nella Embedded WebView. Scegli questo approccio quando mantieni modelli di autenticazione incorporati esistenti o quando hai bisogno del controllo della sessione/cookie per le schermate post-autenticazione.
In definitiva, le passkey nelle app native rappresentano un enorme passo in avanti sia per la comodità dell'utente che per la sicurezza. Che siano implementate tramite Native, System WebView o Embedded WebView, eliminano i rischi di phishing e il peso della gestione delle password per i tuoi utenti. Implementazioni nel mondo reale come l'integrazione nativa delle passkey nell'app VicRoads dimostrano che gli approcci native-first offrono la massima adozione e soddisfazione dell'utente se adeguatamente eseguiti 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 le nuove app, System WebView per i flussi OAuth o Embedded WebView per i modelli incorporati esistenti - puoi offrire accessi biometrici e senza password che realizzano appieno 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 in base all'approccio di implementazione:
application/json.well-knownhttps://tuo-dominio.com (non app://)webcredentials:tuodominio.comASWebAuthenticationSession (consigliato) o
SFSafariViewController?mode=developer durante lo sviluppo (rimuovere per la produzione)WebViewFeature.WEB_AUTHENTICATIONsetWebAuthenticationSupport() chiamato 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 per la passkey compare
?mode=developer su iOS per i test,
verifica il tipo di WebViewPer un debugging dettagliato, consulta il nostro articolo sui Relying Party ID nelle app native.
Una trappola comune: gli ambienti di staging con accesso limitato (IP whitelist, solo VPN) falliranno perché le CDN di Apple e Google devono essere in grado di recuperare i tuoi file di associazione.
https://app-site-association.cdn-apple.com/a/v1/il-tuo-dominio-staging.com?nocache=1https://digitalassetlinks.googleapis.com/v1/statements:list/?source.web.site=https://il-tuo-dominio-staging.com&relation=delegate_permission/common.handle_all_urlsSottodominio di staging con rpID di produzione:
Se il tuo ambiente di staging (ad es., stg.login.example.com) utilizza il dominio di
produzione come rpID (ad es., example.com), la ricerca AASA avviene sul dominio
rpID, non sul tuo sottodominio di staging. Ciò significa:
Esempio (ambienti multipli che condividono un solo AASA):
{ "webcredentials": { "apps": [ "TEAMID123.com.example.app", "TEAMID123.com.example.app.dev", "TEAMID123.com.example.app.stg", "TEAMID123.com.example.app.pre" ] } }
Raccomandazione: Usa un rpID di staging separato che corrisponda al tuo dominio di staging per evitare sovrapposizioni di credenziali tra gli ambienti. Questo richiede file AASA accessibili pubblicamente sul dominio di staging.
Chiarimento su ?mode=developer:
Il parametro ?mode=developer nei Domini Associati elude la cache CDN di Apple ma non
elude il requisito di accessibilità. Il tuo file AASA deve essere ancora raggiungibile
dal dispositivo (non tramite la CDN di Apple, ma direttamente). Questo aiuta durante lo
sviluppo quando si itera sulle modifiche AASA, ma non aiuterà se il tuo server di staging
è limitato ad una whitelist di IP.
SDK Nativi Corbado:
Documentazione della piattaforma:
Strumenti di convalida:
Corbado è la Passkey 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 →
La scelta dipende dalla tua architettura di autenticazione. Se la tua app utilizza OAuth2 o OIDC, System WebView (ASWebAuthenticationSession su iOS o Chrome Custom Tabs su Android) richiede il minor sforzo di implementazione e nessuna configurazione di file di associazione. Per le nuove app native-first, l'implementazione nativa offre un'UX superiore, mentre l'Embedded WebView è adatta alle app che incorporano già l'autenticazione in un frame WebView e necessitano di controllo di sessione o cookie dopo l'accesso.
SFSafariViewController sfrutta il motore di Safari, mostra la barra degli URL con indicatori SSL e offre protezione dal phishing, rendendolo più affidabile per i flussi di autenticazione. WKWebView offre più personalizzazione della UI ma ha un archivio cookie isolato separato da Safari, richiede entitlement Associated Domains e un file AASA per abilitare le passkey, e non mostra la barra degli URL, riducendo i segnali di fiducia dell'utente.
Le Chrome Custom Tabs condividono i cookie e le credenziali salvate con il browser Chrome dell'utente, il che significa che le passkey salvate in Google Password Manager sono accessibili durante l'autenticazione. La WebView standard di Android ha un archivio cookie isolato, non mostra l'URL o gli indicatori SSL, e Google ne ha esplicitamente vietato l'utilizzo per gli accessi agli account Google a causa dei rischi di phishing.
Se un utente ha un gestore di credenziali di terze parti come 1Password impostato come provider attivo, esso intercetterà spesso la creazione e l'archiviazione delle passkey, prendendo la priorità rispetto al gestore di credenziali nativo della piattaforma (Portachiavi di iCloud o Google Password Manager). Ciò significa che le passkey potrebbero essere archiviate nell'app di terze parti anziché nel portachiavi della piattaforma, influendo sulla sincronizzazione cross-device e sul comportamento di gestione delle passkey.
Quando le politiche MDM disabilitano la sincronizzazione delle credenziali, le passkey si legano al dispositivo e non possono passare a un dispositivo sostitutivo, a differenza dei tipici scenari dei consumatori. Le app destinate agli ambienti aziendali dovrebbero pianificare meccanismi di autenticazione di ripiego (fallback) come la password o il login con magic link per gestire i casi in cui un utente riceve un nuovo dispositivo gestito.
Scopri come Corbado si integra con la tua distribuzione di passkey e con lo stack di autenticazione esistente.
Esplora la Console
Articoli correlati
Indice