Le password sono l’anello più debole nella sicurezza degli account. Possono essere oggetto di phishing, trapelate, riutilizzate o dimenticate. Ecco perché abbiamo aggiunto il supporto per le Passkeys WebAuthn - un metodo di autenticazione senza password resistente al phishing, più sicuro e più conveniente.

Cosa sono le Passkeys?

Le Passkeys sono credenziali crittografiche memorizzate sul tuo dispositivo (telefono, laptop, chiave di sicurezza) che sostituiscono le password per l’autenticazione. Utilizzano lo standard WebAuthn (parte di FIDO2) e offrono diversi vantaggi:

  • Resistenti al phishing - Le Passkeys sono legate al dominio del sito web, quindi non possono essere usate su siti falsi
  • Nessun segreto da trapelare - Solo la chiave pubblica viene memorizzata sul server
  • Legate al dispositivo - La chiave privata non lascia mai il tuo dispositivo
  • Protette biometricamente - Tipicamente protette da Face ID, Touch ID o Windows Hello
  • Sincronizzazione tra dispositivi - Le piattaforme moderne sincronizzano le Passkeys tra i dispositivi tramite account iCloud, Google o Microsoft

La nostra implementazione

Abbiamo integrato il supporto per le Passkeys WebAuthn nel nostro stack di autenticazione django-allauth esistente, fornendo endpoint API sia per web che per dispositivi mobili.

Flusso di registrazione

Quando un utente registra una nuova Passkey, il flusso funziona così:

  1. Il client richiede le opzioni di registrazione dal server
  2. Il server genera una sfida con le informazioni dell’utente e della relying party
  3. L’API WebAuthn del browser richiede all’utente (biometria o chiave di sicurezza)
  4. Il client invia le credenziali al server
  5. Il server verifica e memorizza la chiave pubblica
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# API endpoint to begin registration
class WebAuthnRegistrationOptionsView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        from allauth.mfa.webauthn.internal import auth as webauthn_auth

        # Generate credential creation options
        creation_options = webauthn_auth.begin_registration(
            request.user,
            passwordless=False  # Use as 2FA, not passwordless
        )

        return Response({
            "success": True,
            "creation_options": creation_options,
        })

Flusso di autenticazione

Per l’autenticazione a due fattori utilizzando una Passkey:

  1. L’utente completa l’autenticazione primaria (username/password o login social)
  2. Il server restituisce una sfida per la verifica WebAuthn
  3. Il browser richiede la Passkey (tocco biometrico)
  4. Le credenziali vengono verificate rispetto alla chiave pubblica memorizzata
  5. L’utente è completamente autenticato
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class WebAuthnVerifyView(APIView):
    def post(self, request):
        credential = request.data.get("credential")

        # Complete authentication and verify credential
        authenticator = webauthn_auth.complete_authentication(
            request.user,
            credential
        )

        # Record usage for security monitoring
        authenticator.last_used_at = timezone.now()
        authenticator.save()

        return Response({"success": True})

Gestione delle Passkeys

Gli utenti possono gestire le loro Passkeys registrate:

  • Elencare tutte le Passkeys con data di registrazione e ultimo utilizzo
  • Rinominare le Passkeys per un’identificazione più facile (es., “iPhone”, “MacBook”)
  • Eliminare le Passkeys (con protezione contro la rimozione dell’ultimo autenticatore)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
class WebAuthnListView(APIView):
    def get(self, request):
        authenticators = Authenticator.objects.filter(
            user=request.user,
            type=Authenticator.Type.WEBAUTHN
        ).order_by("-created_at")

        return Response({
            "passkeys": [
                {
                    "id": auth.pk,
                    "name": auth.wrap().name,
                    "created_at": auth.created_at.isoformat(),
                    "last_used_at": auth.last_used_at.isoformat() if auth.last_used_at else None,
                }
                for auth in authenticators
            ]
        })

Endpoint API

La nostra REST API fornisce supporto completo per WebAuthn per l’app mobile:

EndpointMetodoDescrizione
/api/webauthn/register/options/GETOttieni sfida di registrazione
/api/webauthn/register/complete/POSTCompleta la registrazione
/api/webauthn/authenticate/options/GETOttieni sfida di autenticazione
/api/webauthn/verify/POSTVerifica credenziali per 2FA
/api/webauthn/GETElenca le Passkeys registrate
/api/webauthn/<id>/PATCHRinomina una Passkey
/api/webauthn/<id>/DELETEElimina una Passkey

Considerazioni sulla sicurezza

Codici di recupero

Quando un utente registra il suo primo autenticatore (Passkey o TOTP), generiamo automaticamente codici di recupero. Questi codici monouso possono essere utilizzati se tutti gli altri metodi di autenticazione non sono disponibili:

1
2
if Authenticator.objects.filter(user=request.user).count() == 1:
    auto_generate_recovery_codes(request._request)

Prevenzione del blocco

Gli utenti non possono eliminare la loro ultima Passkey se li lascerebbe senza alcun metodo di autenticazione a due fattori:

1
2
3
4
if not adapter.can_delete_authenticator(authenticator):
    return Response({
        "message": "Cannot delete - you must have at least one authentication method"
    }, status=400)

Monitoraggio

Tracciamo l’utilizzo delle Passkeys tramite metriche Datadog per il monitoraggio della sicurezza:

1
2
3
increment("webauthn.registration.success")
increment("webauthn.verify.success")
increment("webauthn.verify.failed")

Supporto browser

WebAuthn è supportato in tutti i browser moderni:

  • Chrome 67+
  • Firefox 60+
  • Safari 13+
  • Edge 79+
  • Chrome mobile, Safari, Firefox

Per i browser più vecchi, gli utenti possono ancora utilizzare TOTP (app di autenticazione) o codici di recupero.

L’esperienza utente

Aggiungere una Passkey richiede solo pochi secondi:

  1. Vai su Impostazioni → Sicurezza → Autenticazione a due fattori
  2. Clicca su Aggiungi Passkey
  3. Dai un nome al tuo dispositivo (es., “iPhone 15”)
  4. Autenticati con Face ID / Touch ID / Windows Hello
  5. Fatto! La tua Passkey è registrata

I login futuri richiedono solo una conferma biometrica - niente più digitazione di password o copia di codici da app di autenticazione.

Perché abbiamo scelto le Passkeys

MetodoRischio phishingEsperienza utenteRecupero
PasswordAltoScarsa (dimenticate, deboli)Reset via email
SMS 2FAMedio (SIM swap)DiscretaNumero di telefono
App TOTPBassoInserimento manuale del codiceChiavi di backup
PasskeysMolto bassoEccellenteCodici di recupero

Le Passkeys rappresentano il futuro dell’autenticazione. Sono già supportate dalle piattaforme Apple, Google e Microsoft, rendendole accessibili a quasi tutti i nostri utenti.


Pronto a liberarti delle password? Attiva le Passkeys nelle tue impostazioni di sicurezza!