Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit September 2021 browserübergreifend verfügbar.
* Einige Teile dieser Funktion werden möglicherweise unterschiedlich gut unterstützt.
Sicherer Kontext: Diese Funktion ist nur in sicheren Kontexten (HTTPS) in einigen oder allen unterstützenden Browsern verfügbar.
Die Web Authentication API (WebAuthn) ist eine Erweiterung der Credential Management API, die eine starke Authentifizierung mit öffentlichem Schlüssel ermöglicht und passwortlose Authentifizierung sowie sichere Multi-Faktor-Authentifizierung (MFA) ohne SMS-Textnachrichten ermöglicht.
Im Web werden Passkeys mithilfe der Web Authentication API implementiert.
WebAuthn verwendet asymmetrische (Public-Key-)Kryptographie anstelle von Passwörtern oder SMS-Textnachrichten zur Registrierung, Authentifizierung und Multi-Faktor-Authentifizierung auf Websites. Dies hat einige Vorteile:
Viele Websites haben bereits Seiten, die es Benutzern ermöglichen, neue Konten zu registrieren oder sich in ein bestehendes Konto einzuloggen, und WebAuthn ersetzt oder verbessert den Authentifizierungsteil des Systems. Es erweitert die Credential Management API, abstrahiert die Kommunikation zwischen dem Benutzeragenten und einem Authenticator und bietet die folgende neue Funktionalität:
In ihren grundlegendsten Formen empfangen sowohl create() als auch get() eine sehr große Zufallszahl, den sogenannten "Challenge", vom Server und senden den Challenge, der mit dem privaten Schlüssel signiert wurde, zurück an den Server. Dadurch wird dem Server bewiesen, dass ein Benutzer den privaten Schlüssel besitzt, der für die Authentifizierung erforderlich ist, ohne Geheimnisse über das Netzwerk zu offenbaren.
Hinweis: Der "Challenge" muss ein Datenpuffer mit zufälligen Informationen von mindestens 16 Bytes sein.
Um zu veranschaulichen, wie der Prozess der Erstellung von Anmeldeinformationen funktioniert, beschreiben wir den typischen Ablauf, der auftritt, wenn ein Benutzer ein Anmeldeinformation bei einer Vertrauenspartei registrieren möchte:
Der Server der Vertrauenspartei sendet Benutzerinformationen und Informationen zur Vertrauenspartei zusammen mit dem "Challenge" an die Web-App, die den Registrierungsprozess bearbeitet, über einen geeigneten sicheren Mechanismus (zum Beispiel Fetch oder XMLHttpRequest).
Hinweis: Das Format zum Teilen von Informationen zwischen dem Server der Vertrauenspartei und der Web-App wird von der Anwendung bestimmt. Ein empfohlener Ansatz besteht darin, JSON-Typrepräsentations-Objekte für Anmeldeinformationen und Anmeldeoptions auszutauschen. Bequemlichkeitsmethoden wurden in PublicKeyCredential erstellt, um von JSON-Darstellungen in die von den Authentifizierungs-APIs benötigte Form konvertieren: parseCreationOptionsFromJSON(), parseRequestOptionsFromJSON() und PublicKeyCredential.toJSON().
Die Web-App initiiert die Erstellung eines neuen Anmeldeinformations über den Authenticator, im Auftrag der Vertrauenspartei, über einen Aufruf von navigator.credentials.create(). Dieser Aufruf erhält eine publicKey-Option, die die Gerätefähigkeiten angibt, z. B. ob das Gerät seine eigene Benutzerautentifikation bereitstellt (zum Beispiel mit biometrischen Daten).
Ein typischer create()-Aufruf könnte folgendermaßen aussehen:
Die Parameter des create()-Aufrufs werden dem Authenticator übergeben, zusammen mit einem SHA-256-Hash, der signiert wird, um sicherzustellen, dass er nicht manipuliert wurde.
Nachdem der Authenticator die Zustimmung des Benutzers erhalten hat, generiert er ein Schlüsselpaar und gibt den öffentlichen Schlüssel und die optional signierte Attestation an die Web-App zurück. Dies wird bereitgestellt, wenn das von create() zurückgegebene Promise erfüllt ist, in Form eines PublicKeyCredential-Objekt-Instanz (die PublicKeyCredential.response Eigenschaft enthält die Attestationsinformationen).
Die Web-App leitet das PublicKeyCredential an den Server der Vertrauenspartei weiter, erneut mit einem geeigneten Mechanismus.
Der Server der Vertrauenspartei speichert den öffentlichen Schlüssel zusammen mit der Benutzeridentität, um die Anmeldeinformation für zukünftige Authentifizierungen zu merken. Während dieses Prozesses führt er eine Reihe von Überprüfungen durch, um sicherzustellen, dass die Registrierung vollständig und nicht manipuliert war. Dazu gehören:
Warnung: Attestation bietet einer Vertrauenspartei die Möglichkeit, die Herkunft eines Authenticators zu bestimmen. Vertrauensparteien sollten nicht versuchen, White-Lists von Authenticators zu pflegen.
Nachdem sich ein Benutzer mit WebAuthn registriert hat, kann er sich mit dem Dienst authentifizieren (einloggen). Der Authentifizierungsablauf sieht dem Registrierungsablauf ähnlich aus, die wesentlichen Unterschiede bestehen darin, dass die Authentifizierung:
Ein typischer Authentifizierungsablauf sieht wie folgt aus:
Die Vertrauenspartei erstellt einen "Challenge" und sendet ihn zusammen mit einer Liste von Vertrauenspartei- und Benutzeranmeldeinformationen an den Benutzeragenten über einen geeigneten sicheren Mechanismus. Sie kann auch angeben, wo nach der Anmeldeinformation gesucht werden soll, z. B. auf einem lokalen integrierten Authenticator, oder auf einem externen über USB, BLE usw.
Der Browser bittet den Authenticator, den Challenge über einen Aufruf von navigator.credentials.get() zu signieren, dem die Anmeldeinformationen in einer publicKey-Option übergeben werden.
Ein typischer get()-Aufruf könnte folgendermaßen aussehen:
Die Parameter des get()-Aufrufs werden dem Authenticator übergeben, um die Authentifizierung zu bearbeiten.
Wenn der Authenticator eine der gegebenen Anmeldeinformationen enthält und den Challenge erfolgreich signieren kann, gibt er eine signierte Assertion an die Web-App zurück, nachdem er die Zustimmung des Benutzers erhalten hat. Dies wird bereitgestellt, wenn das von get() zurückgegebene Promise erfüllt ist, in Form eines PublicKeyCredential-Objekt-Instanz (die PublicKeyCredential.response Eigenschaft enthält die Assertion-Informationen).
Die Web-App leitet die signierte Assertion an den Server der Vertrauenspartei zur Validierung weiter. Die Validierungsprüfungen umfassen:
Sobald der Server dies überprüft hat, wird der Authentifizierungsfluss als erfolgreich angesehen.
Die WebAuthn-API unterscheidet zwischen zwei Arten von Public-Key-Anmeldeinformationen:
Entdeckbare Anmeldeinformationen, auch bekannt als resident keys
Nicht-entdeckbare Anmeldeinformationen, auch bekannt als nicht-resident keys
Bei nicht-entdeckbaren Anmeldeinformationen werden das private Schlüsselmater ial sowie zusätzliche Informationen wie der Benutzername und die ID der RP außerhalb des Authenticators gespeichert, typischerweise auf dem RP-Server (deshalb werden diese Anmeldeinformationen auch manchmal als Server-seitige Anmeldeinformationen bezeichnet). Um den privaten Schlüssel sicher auf dem Server zu halten, wird er mit einem im Authenticator gespeicherten Hauptschlüssel verschlüsselt und der resultierende Chiffretext wird als die ID der Anmeldeinformation verwendet.
Wenn der Authenticator eine nicht-entdeckbare Anmeldeinformation generiert, dann:
Wenn die RP sich mit einer nicht-entdeckbaren Anmeldeinformation anmelden muss:
Bei entdeckbaren Anmeldeinformationen speichert der Authenticator selbst:
Der Vorteil einer nicht-entdeckbaren Anmeldeinformation besteht darin, dass der Authenticator keine spezifischen Anmeldedaten speichern muss, was bedeutet, dass er theoretisch eine unbegrenzte Anzahl an Anmeldedaten unterstützen könnte.
Der Nachteil besteht darin, dass der Benutzer, um eine nicht-entdeckbare Anmeldeinformation verwenden zu können, zuerst den Benutzernamen angeben muss, mit dem er sich anmelden möchte, was die RP dann verwenden kann, um ein entsprechendes Set von Anmeldeinformations-IDs zu finden, die dem Browser dem Authenticator zur Verfügung stellen kann.
Im Gegensatz dazu kann der Browser mit entdeckbaren Anmeldeinformationen:
Dies ist die Grundlage der Autofill-UI-Funktion.
Verwenden Sie die Option residentKey in PublicKeyCredentialCreationOptions, um zu steuern, ob eine neue Public-Key-Anmeldeinformation entdeckbar oder nicht-entdeckbar ist.
Hinweis: Beachten Sie, dass Passkeys definitionsgemäß immer entdeckbare Anmeldeinformationen sein müssen.
Autofill-UI, auch als bedingte Vermittlung bezeichnet, ist eine Funktion, die es Benutzern erleichtert, mit öffentlichen Schlüsselanmeldeinformationen zu arbeiten, insbesondere wenn sie auch Passwörter für die Website haben.
Es wird erwartet, dass Websites, die Passkeys einführen, diese typischerweise zusätzlich zum bestehenden Support für passwortbasierte Authentifizierung hinzufügen, sodass ein Benutzer für eine gegebene Website ein Passwort, einen oder mehrere Passkeys oder beides haben kann. In dieser Situation kann eine Benutzeroberfläche, die sie fragt, mit welcher Methode sie sich anmelden möchten, verwirrend sein: Sie erinnern sich möglicherweise dann nicht mehr daran, welche Methode sie für welches Konto haben. Die Autofill-UI hilft bei diesem Problem, indem sie Benutzer einlädt, sich mit einem Passkey anzumelden, nur wenn ein geeigneter Passkey derzeit verfügbar ist.
Um die Autofill-UI zu aktivieren, enthält die Anmeldeseite der Website ein Formular, das sie zur Anmeldung einlädt. In dem Feld für den Benutzernamen enthält die Website einen autocomplete-Wert von "webauthn":
Wenn die Seite geladen wird, prüft die Website zunächst, ob bedingte Vermittlung unterstützt wird, und ruft, falls dies der Fall ist, CredentialsContainer.get() auf. Der Aufruf:
Dies wird warten, bis der Benutzer mit dem Benutzernamen-Feld interagiert.
Wenn und falls der Benutzer mit dem Feld interagiert, wird der Browser alle verfügbaren Authenticators nach öffentlichen Schlüsselanmeldeinformationen fragen, die verwendet werden können, um sich auf dieser Website anzumelden, und die zugehörigen Benutzernamen als Autofill-Optionen für den Benutzer anzeigen, neben allen gespeicherten Passwörtern für das Konto. Wenn der Benutzer eine dieser Optionen auswählt, wird der Browser diese Anmeldeinformation verwenden, um den Benutzer anzumelden.
Dies ermöglicht es einer Website im Wesentlichen, ein einheitliches Autofill anzubieten, das sowohl Passwörter als auch öffentliche Schlüsselanmeldeinformationen für ein einzelnes Konto umfasst.
Hinweis: Beachten Sie, dass nur entdeckbare Anmeldeinformationen in Anrufen enthalten sind, die bedingte Vermittlung verwenden, weil der Browser anwendbare Anmeldeinformationen anfordern muss, ohne deren Anmeldeinformations-IDs zu kennen.
Es ist möglich, dass die im Authenticator eines Benutzers gespeicherten Informationen über eine entdeckbare Anmeldeinformation nicht mehr mit dem Server der Vertrauenspartei synchron sind. Dies könnte auftreten, wenn der Benutzer eine Anmeldeinformation löscht oder seinen Benutzer-/Anzeigenamen in der RP-Web-App ändert, ohne den Authenticator zu aktualisieren.
Die API bietet Methoden, mit denen der Server der Vertrauenspartei Änderungen an den Authenticator signalisieren kann, damit er seine gespeicherten Anmeldeinformationen aktualisieren kann:
Es mag so aussehen, als hätten signalUnknownCredential() und signalAllAcceptedCredentials() ähnliche Zwecke, also in welcher Situation sollte jeder verwendet werden?
Die Anmelde- und Login-Arbeitsabläufe können auf Basis der Fähigkeiten des WebAuthn-Clients (Browser) angepasst werden. Die statische Methode PublicKeyCredential.getClientCapabilities() kann verwendet werden, um diese Fähigkeiten abzufragen; sie gibt ein Objekt zurück, bei dem jeder Schlüssel sich auf eine WebAuthn-Fähigkeit oder -Erweiterung bezieht, und jeder Wert ist ein Boolean, der die Unterstützung für diese Funktion anzeigt.
Dies kann verwendet werden, um beispielsweise zu überprüfen:
Der folgende Code zeigt, wie Sie getClientCapabilities() verwenden könnten, um zu überprüfen, ob der Client Authenticators unterstützt, die biometrische Benutzerverifizierung bieten. Beachten Sie, dass die tatsächlich durchgeführten Aktionen von Ihrer Seite abhängen. Für Websites, die biometrische Authentifizierung erfordern, könnten Sie die Login-Benutzeroberfläche durch eine Nachricht ersetzen, die anzeigt, dass biometrische Authentifizierung benötigt wird, und der Benutzer sollte versuchen, einen anderen Browser oder Gerät zu verwenden.
Die Verfügbarkeit von WebAuthn kann mittels einer Permissions Policy gesteuert werden, wobei zwei Direktiven besonders spezifiziert werden:
Beide Direktiven haben einen Standard-Wert für die Allowlist von "self", was bedeutet, dass diese Methoden standardmäßig in den Kontexten von Top-Level-Dokumenten verwendet werden können. Zudem kann get() in geschachtelten Browsing-Kontexten verwendet werden, die vom selben Origin wie das oberste Dokument geladen werden. get() und create() können in geschachtelten Browsing-Kontexten verwendet werden, die von anderen Origins als das oberste Dokument geladen werden (d.h. in übergreifenden <iframes>), wenn dies von den jeweiligen publickey-credentials-get und publickey-credentials-create Permissions-Policy-Direktiven erlaubt wird. Für übergreifende create()-Aufrufe, wo die Erlaubnis durch allow= in einem iframe erteilt wurde, muss der Frame auch flüchtige Aktivierung haben.
Hinweis: Wo eine Richtlinie die Verwendung dieser Methoden verbietet, wird das von ihnen zurückgegebene Versprechen mit einem NotAllowedError DOMException abgelehnt.
Wenn Sie den Zugriff nur auf eine bestimmte Subdomain erlauben möchten, könnten Sie dies so angeben:
Wenn Sie mit get() oder create() in einem <iframe> authentifizieren möchten, müssen Sie ein paar Schritte befolgen:
Die Website, die die Seite der Vertrauenspartei einbettet, muss die Erlaubnis über ein allow-Attribut geben:
Wenn Sie get() verwenden:
Wenn Sie create() verwenden:
Das <iframe> muss auch eine flüchtige Aktivierung haben, wenn create() übergreifend aufgerufen wird.
Die Website der Vertrauenspartei muss die oben genannten Zugriffe über einen Permissions-Policy-Header erlauben:
Oder um nur eine bestimmte URL zu erlauben, die Website der Vertrauenspartei in einem <iframe> einzubetten:
Bietet einem Dienst einen Nachweis, dass ein Authenticator das nötige Schlüsselpaar hat, um eine Authentifizierungsanfrage erfolgreich zu bearbeiten, die durch einen Aufruf von CredentialsContainer.get() initiiert wurde. Verfügbar in der response-Eigenschaft der PublicKeyCredential-Instanz, die erhalten wird, wenn das get() Promise erfüllt wird.
AuthenticatorAttestationResponseDas Ergebnis einer WebAuthn-Anmeldeinformationsregistrierung (d.h. eines Aufrufs von CredentialsContainer.create()). Es enthält Informationen über die Anmeldeinformation, die der Server benötigt, um WebAuthn-Assertions durchzuführen, wie z. B. deren Anmeldeinformations-ID und öffentlicher Schlüssel. Verfügbar in der response-Eigenschaft der PublicKeyCredential-Instanz, die erhalten wird, wenn das create() Promise erfüllt wird.
AuthenticatorResponseDie Basisschnittstelle für AuthenticatorAttestationResponse und AuthenticatorAssertionResponse.
PublicKeyCredentialBietet Informationen zu einem öffentlichen/privaten Schlüsselpaar, das eine Anmeldeinformation für die Anmeldung bei einem Dienst mithilfe eines Asymmetrischen Schlüsselpaares darstellt, das nicht phishable ist und gegen Datenverletzungen resistent ist, anstelle eines Passworts. Erhalten, wenn das Promise, das durch einen Aufruf von create() oder get() zurückgegeben wird, erfüllt wird.
Ein Aufruf von create() mit einer publicKey-Option initiiert die Erstellung neuer asymmetrischer Schlüssel-Anmeldeinformationen über einen Authenticator, wie oben erklärt.
CredentialsContainer.get(), die publicKey-OptionEin Aufruf von get() mit einer publicKey-Option instruiert den Benutzeragenten, ein bestehendes Set von Anmeldeinformationen zu verwenden, um sich bei einer Vertrauenspartei zu authentifizieren.
Hinweis: Aus Sicherheitsgründen werden die Aufrufe der Web Authentication API (create() und get()) abgebrochen, wenn das Browserfenster den Fokus verliert, während der Aufruf aussteht.
| Web Authentication: An API for accessing Public Key Credentials - Level 3 # iface-pkcredential |
JavaScript aktivieren, um diese Browser-Kompatibilitätstabelle anzuzeigen.
Der Bauplan für ein besseres Internet.
Besuche die gemeinnützige Muttergesellschaft der Mozilla Corporation, die Mozilla Foundation.
Teile dieses Inhalts sind ©1998–2026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfügbar unter einer Creative-Commons-Lizenz.