Passkey / WebAuthn
Le Passkey sono credenziali FIDO2/WebAuthn che consentono agli utenti di autenticarsi con la biometria del dispositivo (Face ID, Touch ID, Windows Hello), chiavi di sicurezza hardware (YubiKey) o autenticatori di piattaforma — senza password.
Le passkey sono resistenti al phishing poiché sono legate al dominio dell’applicazione e non possono essere usate su siti falsi. Non vengono mai trasmesse al server, eliminando i rischi legati alla condivisione di segreti.
Supporto Browser
| Browser | Versione Minima | Autenticatore Piattaforma | Chiavi Hardware |
|---|---|---|---|
| Chrome | 108 | ✅ | ✅ |
| Firefox | 119 | ✅ | ✅ |
| Safari | 16.4 | ✅ | ✅ |
| Edge | 108 | ✅ | ✅ |
| Opera | 94 | ✅ | ✅ |
| Samsung Internet | 22 | ✅ | ✅ |
Le passkey sono sincronizzate tra dispositivi tramite il portachiavi iCloud (Apple), Google Password Manager o Windows Hello for Business. Gli utenti che impostano una passkey su iPhone possono usarla anche su Mac e viceversa.
Configurazione nella Console
Abilita WebAuthn
Vai su Console → Impostazioni → Autenticazione → Metodi Passwordless e abilita Passkey / WebAuthn.
Configura l’Origine
Assicurati che il tuo dominio sia registrato come URL autorizzato nelle impostazioni dell’applicazione. L’origine WebAuthn deve corrispondere esattamente al dominio della tua app (es. https://tuaapp.com).
Flusso di Registrazione
Avvia la Registrazione
La tua app richiede le opzioni di registrazione dal server Auris.
import { startRegistration } from '@simplewebauthn/browser'
const options = await fetch('/api/auth/webauthn/register/challenge', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${accessToken}` },
}).then(r => r.json())Richiedi le Credenziali al Browser
const registration = await startRegistration(options)Il browser mostra il prompt di biometria/passkey all’utente.
Verifica sul Server
const { verified } = await fetch('/api/auth/webauthn/register/verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${accessToken}` },
body: JSON.stringify(registration),
}).then(r => r.json())
if (verified) {
console.log('Passkey registrata!')
}Flusso di Autenticazione
Avvia l’Autenticazione
import { startAuthentication } from '@simplewebauthn/browser'
const options = await fetch('/api/auth/webauthn/authenticate/challenge', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email: '[email protected]' }),
}).then(r => r.json())Ottieni le Credenziali dal Browser
const authentication = await startAuthentication(options)Il browser mostra il prompt di biometria/passkey all’utente.
Verifica e Ottieni i Token
const { tokens, user } = await fetch('/api/auth/webauthn/authenticate/verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(authentication),
}).then(r => r.json())
console.log('Autenticato:', user)Libreria Client
Auris è compatibile con @simplewebauthn/browser per gestire la complessità del WebAuthn lato client:
npm install @simplewebauthn/browserQuesta libreria gestisce la serializzazione/deserializzazione dei buffer, la compatibilità cross-browser e la gestione degli errori.
WebAuthn come Secondo Fattore (2FA)
Le passkey possono essere usate anche come secondo fattore dopo il login con email/password. In questo caso, la registrazione della passkey richiede una sessione attiva e la verifica avviene come step aggiuntivo nel flusso MFA.
Abilitalo da Console → Impostazioni → MFA → Metodi MFA → Passkey / WebAuthn.
Endpoint API
/api/auth/webauthn/register/challengeRequires: authenticatedGenera le opzioni per la registrazione WebAuthn. Richiede una sessione autenticata. Restituisce le opzioni di PublicKeyCredentialCreationOptions.
/api/auth/webauthn/register/verifyRequires: authenticatedVerifica e salva la nuova credenziale WebAuthn. Corpo richiesta: l’oggetto RegistrationResponseJSON di SimpleWebAuthn.
/api/auth/webauthn/authenticate/challengeGenera le opzioni per l’autenticazione WebAuthn. Accetta facoltativamente email per recuperare le credenziali registrate dell’utente.
/api/auth/webauthn/authenticate/verifyVerifica l’assertion WebAuthn e restituisce i token di autenticazione. Corpo richiesta: l’oggetto AuthenticationResponseJSON di SimpleWebAuthn.
/api/auth/webauthn/credentials/{id}Requires: authenticatedRimuove una passkey/credenziale WebAuthn registrata dall’account dell’utente.
Sicurezza
- Resistenza al phishing: Le credenziali WebAuthn sono associate al dominio dell’origine. Una credenziale registrata su
tuaapp.comnon può essere usata sutuaapp-fake.com - Nessun segreto condiviso: La chiave privata non lascia mai il dispositivo dell’utente. Il server memorizza solo la chiave pubblica
- Protezione dalla clonazione: Il contatore delle firme (
sign_count) aumenta a ogni utilizzo. Auris valida il contatore e avvisa in caso di possibile clonazione delle credenziali - Binding all’utente: Le credenziali WebAuthn sono associate a uno specifico utente e non possono essere usate per autenticare un altro utente
Se un utente perde l’accesso a tutti i suoi dispositivi con passkey registrate, potrebbe non riuscire ad accedere. Assicurati di fornire metodi di recupero dell’account alternativi (email di recupero, codici di backup).
Guide Correlate
- Magic Link — Alternativa passwordless via email
- SMS OTP — Autenticazione via codice SMS
- Multi-Factor Authentication — Policy MFA complete
- Passkey (Concetto) — Approfondimento tecnico sui token e le credenziali