Prüfung der Funktionserkennung der Credential Management API

WebAuthn bietet eine auf öffentlichen Schlüsseln basierende Authentifizierung im Web und wird demnächst in Chrome, Firefox und Edge (mit der aktualisierten Spezifikation) unterstützt. Dadurch wird die Sicherheit erhöht. Es wird eine neue Art von Credential-Objekt hinzugefügt, die jedoch Websites beeinträchtigen kann, die die Credential Management API verwenden, ohne die verwendeten Anmeldedatentypen zu erkennen.

if (navigator.credentials && navigator.credentials.preventSilentAccess) {
    // use CM API
}

Stattdessen diese Schritte ausführen

if (window.PasswordCredential || window.FederatedCredential) {
    // Call navigator.credentials.get() to retrieve stored
    // PasswordCredentials or FederatedCredentials.
}

if (window.PasswordCredential) {
    // Get/Store PasswordCredential
}

if (window.FederatedCredential) {
    // Get/Store FederatedCredential
}

if (navigator.credentials && navigator.credentials.preventSilentAccess) {
    // Call navigator.credentials.preventSilentAccess()
}

Hier finden Sie die Änderungen, die am Beispielcode vorgenommen wurden.

Lesen Sie weiter, um zusätzliche Informationen zu erhalten!

Was ist die Credential Management API?

Die Credential Management API (CM API) bietet Websites programmatischen Zugriff auf das Anmeldedatenspeicher des User-Agents zum Speichern und Abrufen von Nutzeranmeldedaten für den aufrufenden Ursprung.

Basis-APIs sind:

  • navigator.credentials.get()
  • navigator.credentials.store()
  • navigator.credentials.create()
  • navigator.credentials.preventSilentAccess()

Die ursprüngliche CM API-Spezifikation definiert zwei Anmeldedatentypen:

  • PasswordCredential
  • FederatedCredential

PasswordCredential ist ein Anmeldedatensatz, der die ID und das Passwort des Nutzers enthält. FederatedCredential ist ein Anmeldedatensatz, der die ID des Nutzers und einen String enthält, der einen Identitätsanbieter darstellt.

Mit diesen beiden Anmeldedaten können Websites:

  • Der Nutzer kann sich mit einem zuvor gespeicherten passwortbasierten oder föderierten Anmeldedatensatz anmelden, sobald er die Seite aufruft (automatische Anmeldung).
  • Speichern Sie die passwortbasierten oder föderierten Anmeldedaten, mit denen sich der Nutzer angemeldet hat.
  • Anmeldedaten des Nutzers auf dem neuesten Stand halten (z.B. nach einer Passwortänderung)

Was ist WebAuthn?

WebAuthn (Web Authentication) fügt der CM API Public-Key-Anmeldedaten hinzu. So können Websites beispielsweise die Zwei-Faktor-Authentifizierung mithilfe von FIDO 2.0-kompatiblen Authentifizierungsgeräten standardmäßig implementieren.

Auf technischer Ebene erweitert WebAuthn die CM API um die PublicKeyCredential-Schnittstelle.

Was ist das Problem?

Bisher haben wir Entwicklern empfohlen, die CM API mit dem folgenden Code zu erkennen:

if (navigator.credentials && navigator.credentials.preventSilentAccess) {
  // Use CM API
}

But as you can see from the descriptions above, the `navigator.credentials` is
now expanded to support public-key credentials in addition to password
credentials and federated credentials.

The problem is that user agents don't necessarily support all kinds of
credentials. If you continue feature detect using `navigator.credentials`, your
website may break when you are using a certain credential type not supported by
the browser.

**Supported credential types by browsers**
<table class="properties with-heading-tint"><tbody><tr>
<th></th>
<th>PasswordCredential / FederatedCredential</th>
<th>PublicKeyCredential</th>
</tr><tr><th>Chrome
</th><td>Available
</td><td>In development
</td></tr><tr><th>Firefox
</th><td>N/A
</td><td>Aiming to ship on 60
</td></tr><tr><th>Edge
</th><td>N/A
</td><td>Implemented with <a href="https://blogs.windows.com/msedgedev/2016/04/12/a-world-without-passwords-windows-hello-in-microsoft-edge/">older API</a>. New API (navigator.credentials) coming soon.
</td></tr></tbody></table>


## The solution
You can avoid this by modifying feature detection code as follows to explicitly
test for the credential type that you intend to use.

```js
if (window.PasswordCredential || window.FederatedCredential) {
    // Call navigator.credentials.get() to retrieve stored
    // PasswordCredentials or FederatedCredentials.
}

if (window.PasswordCredential) {
    // Get/Store PasswordCredential
}

if (window.FederatedCredential) {
    // Get/Store FederatedCredential
}

if (navigator.credentials && navigator.credentials.preventSilentAccess) {
    // Call navigator.credentials.preventSilentAccess()
}

Hier finden Sie die tatsächlichen Änderungen, die am Beispielcode vorgenommen wurden.

Hier ist eine Referenz zum Erkennen von PublicKeyCredential, die in WebAuthn hinzugefügt wurde:

if (window.PublicKeyCredential) {
    // use CM API with PublicKeyCredential added in the WebAuthn spec
}

Zeitachse

Die früheste verfügbare Implementierung von WebAuthn ist Firefox. Die stabile Version soll Anfang Mai 2018 verfügbar sein.

Finally

Bei Fragen können Sie sich an @agektmr oderagektmr@chromium.org wenden.