Questo documento illustra cosa è presente userVerification
in WebAuthn e i comportamenti del browser che si verificano quando userVerification
viene specificato durante la creazione della passkey o l'autenticazione.
Che cos'è la "verifica dell'utente" in WebAuthn?
Le passkey si basano sulla crittografia a chiave pubblica. Con la creazione di una passkey, viene generata una coppia di chiavi pubblica/privata, la chiave privata viene archiviata dal provider di passkey e la chiave pubblica viene restituita al server della parte di base (RP) per archiviarla. Il server può autenticare un utente verificando una firma firmata dalla stessa passkey con la chiave pubblica accoppiata. L'"utente presente" Il flag (UP) su una credenziale di chiave pubblica dimostra che qualcuno ha interagito con il dispositivo durante l'autenticazione.
La verifica dell'utente è un livello di sicurezza opzionale che mira ad affermare che durante l'autenticazione era presente la persona corretta e non solo una persona, come afferma la presenza dell'utente. Sugli smartphone, questa operazione viene in genere eseguita utilizzando il meccanismo di blocco schermo, che si tratti di un dato biometrico, un PIN o una password. Se la verifica dell'utente è stata eseguita è riportata nella sezione "UV" che viene restituito nei dati dell'autenticatore durante la registrazione e l'autenticazione della passkey
.Come vengono convalidati UP e UV sul server
I flag booleani di presenza dell'utente (UP) e di verifica dell'utente (UV) vengono segnalati al server nel campo dei dati dell'autenticatore. Durante l'autenticazione, i contenuti del campo dei dati dell'autenticatore possono essere convalidati verificando la firma utilizzando la chiave pubblica archiviata. Finché la firma è valida, il server può considerare autentici i flag.
Al momento della registrazione e dell'autenticazione della passkey, il server deve verificare che il flag UP sia true
e se il flag UV è true
o false
, a seconda del requisito.
Specificare il parametro userVerification
Secondo la specifica WebAuthn, la parte soggetta a limitazioni può richiedere una verifica dell'utente con un parametro userVerification
sia nella creazione delle credenziali sia nell'asserzione. Accetta 'preferred'
, 'required'
o 'discouraged'
, che significano rispettivamente:
'preferred'
(impostazione predefinita): è preferibile utilizzare un metodo di verifica dell'utente sul dispositivo, ma si può saltare questo passaggio se non è disponibile. La credenziale di risposta contiene un valore del flag UVtrue
se è stata eseguita la verifica dell'utente efalse
se la verifica UV non è stata eseguita.'required'
: è necessario richiamare un metodo di verifica dell'utente disponibile sul dispositivo. Se non è disponibile, la richiesta non riesce localmente. Ciò significa che la credenziale di risposta restituisce sempre il flag UV impostato sutrue
.'discouraged'
: è sconsigliato utilizzare un metodo di verifica dell'utente. Tuttavia, a seconda del dispositivo, la verifica dell'utente può essere comunque eseguita e il flag UV può conteneretrue
ofalse
.
Codice campione per la creazione di una passkey:
const publicKeyCredentialCreationOptions = {
// ...
authenticatorSelection: {
authenticatorAttachment: 'platform',
residentKey: 'required',
requireResidentKey: true,
userVerification: 'preferred'
}
};
const credential = await navigator.credentials.create({
publicKey: publicKeyCredentialCreationOptions
});
Codice campione per l'autenticazione tramite passkey:
const publicKeyCredentialRequestOptions = {
challenge: /* Omitted challenge data... */,
rpId: 'example.com',
userVerification: 'preferred'
};
const credential = await navigator.credentials.get({
publicKey: publicKeyCredentialRequestOptions
});
Quale opzione dovresti scegliere per userVerification
?
Il valore userVerification
da utilizzare dipende dai requisiti dell'applicazione e dalle esigenze relative all'esperienza utente.
Quando utilizzare userVerification='preferred'
Utilizza userVerification='preferred'
se dai la priorità all'esperienza utente piuttosto che alla protezione.
In alcuni casi, la verifica dell'utente è più complessa che protetta. Ad esempio, su macOS in cui Touch ID non è disponibile (perché il dispositivo non lo supporta, è disattivato o il dispositivo è in modalità clamshell), all'utente viene chiesto di inserire la password di sistema. Questo crea problemi e l'utente potrebbe abbandonare del tutto l'autenticazione. Se per te è più importante eliminare l'attrito, usa userVerification='preferred'
.
Con userVerification='preferred'
, il flag UV è true
se la verifica dell'utente viene eseguita correttamente e false
se la verifica dell'utente viene saltata. Ad esempio, su macOS in cui Touch ID non è disponibile, chiede all'utente di fare clic su un pulsante per saltare la verifica dell'utente e la credenziale della chiave pubblica include un flag UV false
.
Il flag UV può quindi essere un segnale nell'analisi del rischio. Se il tentativo di accesso sembra rischioso a causa di altri fattori, puoi sottoporre all'utente ulteriori verifiche di accesso se la verifica non è stata eseguita.
Quando utilizzare userVerification='required'
Usa userVerification='required'
se ritieni che sia UP sia UV siano assolutamente necessari.
Uno svantaggio di questa opzione è che l'utente potrebbe riscontrare maggiori problemi durante l'accesso. Ad esempio, su macOS in cui Touch ID non è disponibile, all'utente viene chiesto di inserire la password di sistema.
Con userVerification='required'
, puoi fare in modo che la verifica dell'utente venga eseguita sul dispositivo. Assicurati che il server verifichi che il flag UV sia true
.
Conclusione
Sfruttando la verifica dell'utente, le parti che utilizzano le passkey possono valutare la probabilità che il proprietario del dispositivo effettui l'accesso. Sta a lui scegliere se richiedere la verifica dell'utente o renderlo facoltativo, a seconda di quanto critico il meccanismo di accesso di riserva influisce sul flusso dell'utente. Assicurati che il server controlli il flag UP e il flag UV per l'autenticazione utente tramite passkey.