Passwörter sind das schwächste Glied in der Kontosicherheit. Sie können gephisht, geleakt, wiederverwendet oder vergessen werden. Deshalb haben wir Unterstützung für WebAuthn Passkeys hinzugefügt - eine phishing-resistente, passwortlose Authentifizierungsmethode, die sowohl sicherer als auch bequemer ist.

Was sind Passkeys?

Passkeys sind kryptografische Anmeldedaten, die auf Ihrem Gerät (Smartphone, Laptop, Sicherheitsschlüssel) gespeichert sind und Passwörter zur Authentifizierung ersetzen. Sie verwenden den WebAuthn-Standard (Teil von FIDO2) und bieten mehrere Vorteile:

  • Phishing-resistent - Passkeys sind an die Domain der Website gebunden und können daher nicht auf gefälschten Seiten verwendet werden
  • Keine Geheimnisse zum Leaken - Nur der öffentliche Schlüssel wird auf dem Server gespeichert
  • Gerätegebunden - Der private Schlüssel verlässt nie Ihr Gerät
  • Biometrisch geschützt - Typischerweise durch Face ID, Touch ID oder Windows Hello gesichert
  • Geräteübergreifende Synchronisierung - Moderne Plattformen synchronisieren Passkeys über iCloud-, Google- oder Microsoft-Konten zwischen Geräten

Unsere Implementierung

Wir haben die WebAuthn Passkey-Unterstützung in unseren bestehenden django-allauth Authentifizierungs-Stack integriert und stellen sowohl Web- als auch mobile API-Endpunkte bereit.

Registrierungsablauf

Wenn ein Benutzer einen neuen Passkey registriert, funktioniert der Ablauf folgendermaßen:

  1. Der Client fordert Registrierungsoptionen vom Server an
  2. Der Server generiert eine Challenge mit Benutzer- und Relying-Party-Informationen
  3. Die WebAuthn-API des Browsers fordert den Benutzer auf (Biometrie oder Sicherheitsschlüssel)
  4. Der Client sendet die Anmeldedaten zurück an den Server
  5. Der Server verifiziert und speichert den öffentlichen Schlüssel
 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,
        })

Authentifizierungsablauf

Für die Zwei-Faktor-Authentifizierung mit einem Passkey:

  1. Der Benutzer schließt die primäre Authentifizierung ab (Benutzername/Passwort oder Social Login)
  2. Der Server gibt eine Challenge zurück zur WebAuthn-Verifizierung
  3. Der Browser fordert den Passkey an (biometrische Berührung)
  4. Die Anmeldedaten werden verifiziert gegen den gespeicherten öffentlichen Schlüssel
  5. Der Benutzer ist vollständig authentifiziert
 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})

Passkey-Verwaltung

Benutzer können ihre registrierten Passkeys verwalten:

  • Alle Passkeys auflisten mit Registrierungsdatum und letzter Nutzung
  • Passkeys umbenennen zur einfacheren Identifizierung (z.B. “iPhone”, “MacBook”)
  • Passkeys löschen (mit Schutz gegen das Entfernen des letzten Authentifikators)
 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
            ]
        })

API-Endpunkte

Unsere REST-API bietet vollständige WebAuthn-Unterstützung für die mobile App:

EndpunktMethodeBeschreibung
/api/webauthn/register/options/GETRegistrierungs-Challenge abrufen
/api/webauthn/register/complete/POSTRegistrierung abschließen
/api/webauthn/authenticate/options/GETAuthentifizierungs-Challenge abrufen
/api/webauthn/verify/POSTAnmeldedaten für 2FA verifizieren
/api/webauthn/GETRegistrierte Passkeys auflisten
/api/webauthn/<id>/PATCHEinen Passkey umbenennen
/api/webauthn/<id>/DELETEEinen Passkey löschen

Sicherheitsüberlegungen

Wiederherstellungscodes

Wenn ein Benutzer seinen ersten Authentifikator registriert (Passkey oder TOTP), generieren wir automatisch Wiederherstellungscodes. Diese Einmalcodes können verwendet werden, wenn alle anderen Authentifizierungsmethoden nicht verfügbar sind:

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

Aussperrungsschutz

Benutzer können ihren letzten Passkey nicht löschen, wenn sie dadurch ohne jegliche Zwei-Faktor-Authentifizierungsmethode bleiben würden:

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)

Überwachung

Wir verfolgen die Passkey-Nutzung über Datadog-Metriken zur Sicherheitsüberwachung:

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

Browser-Unterstützung

WebAuthn wird in allen modernen Browsern unterstützt:

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

Für ältere Browser können Benutzer weiterhin TOTP (Authenticator-Apps) oder Wiederherstellungscodes verwenden.

Das Benutzererlebnis

Das Hinzufügen eines Passkeys dauert nur Sekunden:

  1. Gehen Sie zu Einstellungen → Sicherheit → Zwei-Faktor-Authentifizierung
  2. Klicken Sie auf Passkey hinzufügen
  3. Benennen Sie Ihr Gerät (z.B. “iPhone 15”)
  4. Authentifizieren Sie sich mit Face ID / Touch ID / Windows Hello
  5. Fertig! Ihr Passkey ist registriert

Zukünftige Anmeldungen erfordern nur eine biometrische Bestätigung - kein Eingeben von Passwörtern oder Kopieren von Codes aus Authenticator-Apps mehr.

Warum wir uns für Passkeys entschieden haben

MethodePhishing-RisikoBenutzererfahrungWiederherstellung
PasswörterHochSchlecht (vergessen, schwach)E-Mail-Zurücksetzung
SMS 2FAMittel (SIM-Swap)OkayTelefonnummer
TOTP-AppsNiedrigManuelle CodeeingabeBackup-Schlüssel
PasskeysSehr niedrigAusgezeichnetWiederherstellungscodes

Passkeys repräsentieren die Zukunft der Authentifizierung. Sie werden bereits von Apple-, Google- und Microsoft-Plattformen unterstützt, was sie für fast alle unsere Benutzer zugänglich macht.


Bereit für passwortlose Anmeldung? Aktivieren Sie Passkeys in Ihren Sicherheitseinstellungen!