Diese Seite wurde automatisch übersetzt. Lesen Sie die englische Originalversion hier.

Passkeys-Cheatsheet. Praxisnahe Leitfäden, Rollout-Muster und KPIs für Passkey-Programme.
Die Bereitstellung einer sicheren und einfachen Benutzerauthentifizierung ist für digitale Unternehmen im Jahr 2024 ein Muss. Passkeys als neuer Login-Standard sind die ideale Lösung, um diese Anforderungen zu erfüllen. Die verbesserte Benutzererfahrung und Sicherheit von Passkeys hat jedoch ihren Preis bei der Implementierung für Entwickler. Die Schwierigkeit bei der Implementierung rührt daher, dass Passkeys relativ neu sind – für Benutzer, aber auch für Entwickler – und dass ihre Implementierung im Vergleich zur passwortbasierten Authentifizierung recht anspruchsvoll sein kann. Tatsächlich benötigen Sie mindestens vier API-Endpunkte für die Passkey-Authentifizierung im Vergleich zu einem API-Endpunkt für die Passwort-Authentifizierung.
Eine der Kernkomponenten auf der Serverseite zur Bereitstellung der Passkey-Authentifizierung ist der WebAuthn-Server (grüner Bibliotheksteil). Für einen umfassenden Leitfaden, wie sich der WebAuthn-Server in die breitere Integration des Enterprise-Stacks einfügt, lesen Sie unseren speziellen Artikel.
Quelle: Yubico
In diesem Blogbeitrag vergleichen wir verschiedene WebAuthn-Server-Bibliotheken / Pakete / SDKs, analysieren Unterschiede und geben eine Empfehlung für Entwickler, die neu in der Passkey-Implementierung sind.
Aktuelle Artikel
📖
Parallels Passkeys: Testen von Cross-Device Authentication auf einer Windows 11 VM (Mac)
⚙️
9 WebAuthn-Server-Implementierungsbibliotheken im Vergleich
⚙️
Client Hints & User-Agents in Chrome, Safari & Firefox
⚙️
Passkeys Cheat Sheet für Entwickler
👤
So löschen Sie einen Passkey auf Apple, Windows und Android
Um besser zu verstehen, warum überhaupt eine WebAuthn-Server-Bibliothek benötigt wird, lassen Sie uns einen Blick darauf werfen, wie Passkeys implementiert werden können. Im Prinzip gibt es zwei Möglichkeiten, Passkeys in Websites und Apps zu integrieren:
Während eine Drittanbieter-Lösung für Passkeys einfach zu integrieren ist und in der Regel viel Entwicklungszeit spart (insbesondere bei Edge-Cases, Wartung, Wiederherstellung, Fallbacks und verbesserter Passkey-UX), ziehen es einige Entwickler vor, alles selbst zu implementieren.
Testen Sie Passkeys in einer Live-Demo.
Lassen Sie uns ansehen, wie die Do-it-yourself-Passkey-Implementierung funktioniert. In einem sehr grundlegenden Setup wird ein Mechanismus zur Registrierung (Sign-up) und Authentifizierung (Login) benötigt. Beide Prozesse, auch WebAuthn-Zeremonien genannt, werden unterschiedlich gehandhabt, auch wenn der Gesamtablauf einem ähnlichen Schema folgt:
PublicKeyCredentialCreationOptions und PublicKeyCredentialRequestOptions genannt. Einer der wichtigsten Teile dieser WebAuthn-Parameter ist die Challenge. Die WebAuthn-Parameter werden dann zurück an das Frontend gesendet.Da jeder Registrierungs- / Login-Prozess diese Schritte umfasst, muss das Backend den Überblick über Benutzer, Passkeys und Registrierungs- / Login-Anfragen behalten.
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 studyWenn Sie tiefergehendes Wissen über die Funktionsweise von Passkeys erlangen möchten und sehen wollen, wie eine einfache Implementierung aussieht (ohne eine Passkey-Lösung von Drittanbietern zu verwenden), können Sie unseren Blogartikel hier lesen.
In realen Szenarien sollten Sie bei der eigenen Implementierung von Passkeys bedenken, dass es nicht nur darum geht, die notwendigen API-Endpunkte und die grundlegende Implementierung für Registrierung und Login bereitzustellen. Darüber hinaus müssen Sie sich mit den folgenden Themen und Anwendungsfällen befassen:
Für die grundlegende Passkey-Implementierung müssen Sie sich jedoch nur an den WebAuthn-Standard halten. Die Implementierung einer bekannten und unterstützten WebAuthn-Server-Bibliothek ist in der Regel ausreichend. Die Bibliothek generiert die WebAuthn-Server-Parameter und verifiziert Login-Challenges, womit sie im Wesentlichen den kryptografischen und komplexesten Teil für Sie übernimmt.
Werden Sie Teil unserer Passkeys Community für Updates und Support.
Alle analysierten WebAuthn-Server-Bibliotheken bieten die notwendigen Funktionalitäten, um eine Passkey-Authentifizierung anzubieten. Daher haben wir besonderes Augenmerk auf folgende Kriterien gelegt:
Die folgenden WebAuthn-Server-Bibliotheken wurden analysiert (geordnet nach absteigender Anzahl von GitHub-Sternen im Dezember 2023):
Sehen Sie, wie viele Menschen Passkeys tatsächlich nutzen.
authenticatorAttachment, residentKey, requireResidentKey und userVerification enthalten, die auch auf der W3C-Seite erklärt werden)type UserModel = { id: string; username: string; currentChallenge?: string; }; /** * It is strongly advised that authenticators get their own DB * table, ideally with a foreign key to a specific UserModel. * * "SQL" tags below are suggestions for column data types and * how best to store data received during registration for use * in subsequent authentications. */ type Authenticator = { // SQL: Encode to base64url then store as `TEXT`. Index this column credentialID: Uint8Array; // SQL: Store raw bytes as `BYTEA`/`BLOB`/etc... credentialPublicKey: Uint8Array; // SQL: Consider `BIGINT` since some authenticators return atomic timestamps as counters counter: number; // SQL: `VARCHAR(32)` or similar, longest possible value is currently 12 characters // Ex: 'singleDevice' | 'multiDevice' credentialDeviceType: CredentialDeviceType; // SQL: `BOOL` or whatever similar type is supported credentialBackedUp: boolean; // SQL: `VARCHAR(255)` and store string array as a CSV string // Ex: ['usb' | 'ble' | 'nfc' | 'internal'] transports?: AuthenticatorTransport[]; };
public class StoredCredential { /// <summary> /// The Credential ID of the public key credential source. /// </summary> public byte[] Id { get; set; } /// <summary> /// The credential public key of the public key credential source. /// </summary> public byte[] PublicKey { get; set; } /// <summary> /// The latest value of the signature counter in the authenticator data from any ceremony using the public key credential source. /// </summary> public uint SignCount { get; set; } /// <summary> /// The value returned from getTransports() when the public key credential source was registered. /// </summary> public AuthenticatorTransport[] Transports { get; set; } /// <summary> /// The value of the BE flag when the public key credential source was created. /// </summary> public bool IsBackupEligible { get; set; } /// <summary> /// The latest value of the BS flag in the authenticator data from any ceremony using the public key credential source. /// </summary> public bool IsBackedUp { get; set; } /// <summary> /// The value of the attestationObject attribute when the public key credential source was registered. /// Storing this enables the Relying Party to reference the credent’al's attestation statement at a later time. /// </summary> public byte[] AttestationObject { get; set; } /// <summary> /// The value of the clientDataJSON attribute when the public key credential source was registered. /// Storing this in combination with the above attestationObject item enables the Relying Party to re-verify the attestation signature at a later time. /// </summary> public byte[] AttestationClientDataJson { get; set; } public List<byte[]> DevicePublicKeys { get; set; } public byte[] UserId { get; set; } public PublicKeyCredentialDescriptor Descriptor { get; set; } public byte[] UserHandle { get; set; } public string AttestationFormat { get; set; } public DateTimeOffset RegDate { get; set; } public Guid AaGuid { get; set; } }
<?php declare(strict_types=1); namespace App\Entity; use App\Repository\PublicKeyCredentialSourceRepository; use DateTimeImmutable; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Uid\AbstractUid; use Symfony\Component\Uid\Uuid; use Webauthn\PublicKeyCredentialSource as BasePublicKeyCredentialSource; use Webauthn\TrustPath\TrustPath; #[ORM\Table(name: 'pk_credential_sources')] #[ORM\Entity(repositoryClass: PublicKeyCredentialSourceRepository::class)] class PublicKeyCredentialSource extends BasePublicKeyCredentialSource { #[ORM\Column(type: Types::DATETIME_IMMUTABLE)] public readonly DateTimeImmutable $createdAt; #[ORM\Id] #[ORM\Column(type: Types::STRING, length: 255)] #[ORM\GeneratedValue(strategy: 'NONE')] private string $id; public function __construct( string $publicKeyCredentialId, string $type, array $transports, string $attestationType, TrustPath $trustPath, AbstractUid $aaguid, string $credentialPublicKey, string $userHandle, int $counter ) { $this->id = Uuid::v4()->toRfc4122(); $this->createdAt = new DateTimeImmutable(); parent::__construct($publicKeyCredentialId, $type, $transports, $attestationType, $trustPath, $aaguid, $credentialPublicKey, $userHandle, $counter); } public function getId(): string { return $this->id; } }
UserVerificationRequirement mit den Werten discouraged, preferred, required bietet webauthn4j verificationRequired und userPrecenseRequired als boolesche Variablen an.Die folgende Tabelle bietet einen Überblick über die WebAuthn-Server-Bibliotheken:
Abonnieren Sie unseren Passkeys Substack für aktuelle News.
Da die meisten Bibliotheken gleichermaßen leistungsstark sind und den WebAuthn-Standard implementieren, empfehlen wir den folgenden Entscheidungsbaum:
Wenn Sie einfach mehr über WebAuthn-Server im Allgemeinen lernen möchten, ohne bereits ein konkretes Projekt zu haben, können wir einige Empfehlungen aussprechen, da es einige Unterschiede zwischen den Bibliotheken und ihrem ergänzenden Material wie Dokumentationen und Beispielimplementierungen gibt. Für Softwareentwickler, die begierig darauf sind, ihre Passkey-Implementierungsreise zu starten, raten wir, die folgenden Implementierungen zu wählen:
Für ein noch tieferes Verständnis darüber, wie WebAuthn auf der Serverseite funktioniert, können Sie den sehr detaillierten Abschnitt „WebAuthn Relying Party Operations“ im WebAuthn-RFC lesen, in dem jeder Schritt detailliert beschrieben wird, der für die Registrierung eines neuen Credentials (7.1) und die Verifizierung einer Authentication Assertion (7.2) implementiert werden muss.
Bewerten Sie die spezifischen Anforderungen an Passkeys und WebAuthn, die Sie haben. In diesem Blogbeitrag sind wir davon ausgegangen, dass Sie Passkeys nur als Discoverable Credentials unterstützen möchten. Lesen Sie mehr über die PublicKeyCredentialCreationOptions und PublicKeyCredentialRequestOptions zusammen mit den clientseitigen WebAuthn-API-Aufrufen navigator.credentials.create() und navigator.credentials.get(), um die Parameter in der Konfiguration des WebAuthn-Server-SDKs für Ihren Anwendungsfall richtig einzustellen.
Für alle WebAuthn-Server-Bibliotheken müssen Sie die entsprechende Datenbankstruktur bereitstellen, um die folgenden Informationen zu persistieren / darauf zuzugreifen:
Für einige Bibliotheken gibt es spezifische Empfehlungen und Beispiele (sofern wir sie nützlich fanden, haben wir sie oben aufgeführt). Es ist unerlässlich, vollständig zu verstehen, welche WebAuthn-Felder wo gespeichert werden müssen. Achten Sie besonders darauf, welchen Wert Sie für die Benutzer-ID (user.id) verwenden möchten. Wir haben dazu hier eine detailliertere Erklärung. Berücksichtigen Sie auch, was passiert, wenn ein Benutzer einen Passkey löscht. Daneben können Sie optional die Verwendung bestimmter Authentikatoren einschränken. Eine Liste gültiger Authentikatoren im Zusammenhang mit Passkeys finden Sie hier. Falls Sie auch die Attestations von Security Keys unterstützen und überprüfen möchten, ist dies eine ganz andere Geschichte. Weitere Informationen dazu finden Sie hier.
Identifizieren Sie, auf welchen Geräten Ihre Benutzer Passkeys und Fallback-Authentifizierungsmethoden verwenden werden. Falls Sie sich nicht sicher sind, welche Geräte, Browser und Betriebssysteme Ihre Benutzer verwenden, schauen Sie sich State of Passkeys an, um die neuesten Daten zur Passkey-Bereitschaft über Plattformen, Browser und Betriebssysteme hinweg zu erhalten. Wenn Sie spezifische Fragen zur Passkey-Adoption und zum Anteil der Passkey-Bereitschaft bestimmter Geräte haben, können Sie sich gerne an uns wenden. Wir geben Ihnen gerne weitere Einblicke und helfen Ihnen bei diesem Thema (siehe auch unseren neuesten Blogbeitrag zur Passkey-Bereitschaft). Aus Sicht der Observability sollten Sie clientseitige WebAuthn-Fehler und Server-Verifizierungsablehnungen als separate Streams betrachten; verwenden Sie für clientseitige Bucket-Definitionen WebAuthn-Fehler. Darüber hinaus sollten Sie bedenken, dass Sie sich für Windows 10 und Linux dedizierte Lösungen einfallen lassen müssen, da diese Betriebssysteme die geringste (wenn überhaupt) Passkey-Unterstützung bieten.
Sehen Sie, wie viele Menschen Passkeys tatsächlich nutzen.
Für fast jede Sprache oder jedes Framework gibt es mittlerweile eine gut etablierte WebAuthn-Server-Bibliothek. Der Vergleich von Bibliotheken verschiedener Sprachen zeigt keine eindeutige Überlegenheit bestimmter Implementierungen. Vielmehr sollten Sie das Framework / die Programmiersprache verwenden, mit der Sie am meisten vertraut sind. Alternativ, wenn Sie WebAuthn nicht selbst implementieren und sich um all die Dinge kümmern möchten, die damit einhergehen, können Sie eine dedizierte, vorgefertigte Passkey-Authentifizierungslösung wie Corbado ausprobieren. Als Passkey-zentrierte All-in-One-Authentifizierungslösung verfügt sie über großartige Passkey Intelligence, Sitzungsverwaltung sowie Fallback-Authentifizierungsmethoden, sodass Sie sich auf die Entwicklung Ihres Produkts konzentrieren und das Thema Authentifizierung abgeben können. Sie können es kostenlos und für eine unbegrenzte Anzahl von Benutzern hier ausprobieren.
Corbado ist die Authentication Intelligence Platform für CIAM-Teams, die Consumer-Authentifizierung im großen Maßstab betreiben. Wir zeigen Ihnen, was IDP-Logs und generische Analytics-Tools nicht sehen können: welche Geräte, OS-Versionen, Browser und Credential-Manager Passkeys unterstützen, warum Enrollments nicht zu Logins werden, wo der WebAuthn-Flow scheitert und wann ein OS- oder Browser-Update den Login still und leise unterbricht – und das alles, ohne Okta, Auth0, Ping, Cognito oder Ihren In-House-IDP zu ersetzen. Zwei Produkte: Corbado Observe ergänzt Observability für Passkeys und jede andere Login-Methode. Corbado Connect bringt Managed Passkeys mit integrierter Analytics (neben Ihrem IDP). VicRoads betreibt Passkeys für über 5 Mio. Nutzer mit Corbado (+80 % Passkey-Aktivierung). Mit einem Passkey-Experten sprechen →
Prüfen Sie zunächst, ob eine Bibliothek für Ihr spezifisches Framework existiert, und dann für Ihre Programmiersprache. Da alle aufgeführten Bibliotheken den WebAuthn-Standard gleichermaßen implementieren, sollte bei der Wahl eher die Vertrautheit mit Ihrem bestehenden Stack im Vordergrund stehen als Funktionsunterschiede zwischen den Bibliotheken.
Mindestens müssen Sie Credentials, Benutzer, Challenges und Authentikatoren persistieren. Achten Sie genau darauf, welchen Wert Sie als Benutzer-ID (userHandle) vergeben, und planen Sie Szenarien ein, in denen Benutzer einen Passkey von ihrem Gerät löschen könnten.
WebAuthn-Server-Bibliotheken übernehmen die komplexesten kryptografischen Operationen: die Generierung der Parameter PublicKeyCredentialCreationOptions und PublicKeyCredentialRequestOptions sowie die Verifizierung signierter Challenges. Dies korrekt von Grund auf neu zu tun, ist deutlich schwieriger als die Verwendung einer FIDO-konformen Bibliothek, die bereits getestet und auditiert wurde.
Windows 10 und Linux bieten die geringste Passkey-Unterstützung, sodass für Benutzer auf diesen Plattformen dedizierte Fallback-Lösungen erforderlich sind. Die Überwachung von clientseitigen WebAuthn-Fehlern und Server-Verifizierungsablehnungen als separate Streams hilft dabei, betriebssystemspezifische Probleme in der Produktion zu identifizieren.
Sehen Sie, wie Corbado zu Ihrem Passkey-Rollout und bestehenden Authentifizierungs-Stack passt.
Console ansehen
Ähnliche Artikel
Inhaltsverzeichnis