Passkeys mit den Anmeldedaten auf Ihrem Server mit der Signal API abgleichen

Veröffentlicht: 12. November 2024

Mit der WebAuthn Signal API können vertrauende Seiten vorhandene Anmeldedaten an verbundene Passkey-Anbieter senden. So kann ein unterstützender Passkey-Anbieter fehlerhafte oder widerrufene Passkeys aus seinem Speicher aktualisieren oder entfernen, damit sie Nutzern nicht mehr angeboten werden.

Kompatibilität

Chrome für Computer unterstützt die Signal API ab Chrome 132. Der Google Passwortmanager kann Passkeys entsprechend aktualisieren. Chrome-Erweiterungsbasierte Passkey-Anbieter können selbst entscheiden, ob sie das Signal berücksichtigen möchten.

Chrome für Android wird später unterstützt.

Safari unterstützt die Funktion, sie ist aber noch nicht implementiert. Firefox hat noch keine Stellungnahme dazu abgegeben.

Hintergrund

Wenn ein Passkey (ein auffindbares Anmeldedatenelement) erstellt wird, werden Metadaten wie ein Nutzername und ein Anzeigename zusammen mit dem privaten Schlüssel beim Passkey-Anbieter (z. B. einem Passwortmanager) gespeichert. Die Anmeldedaten für den öffentlichen Schlüssel werden auf dem Server der vertrauenden Partei gespeichert. Wenn der Nutzername und der Anzeigename gespeichert werden, kann der Nutzer leichter erkennen, mit welchem der angebotenen Passkeys er sich anmelden soll, wenn er dazu aufgefordert wird. Das ist besonders nützlich, wenn er mehr als zwei Passkeys von verschiedenen Passkey-Anbietern hat.

Es gibt jedoch einige Fälle, in denen Inkonsistenzen zwischen der Passkey-Liste des Passkey-Anbieters und der Anmeldedatenliste des Servers zu Verwirrung führen können.

Im ersten Fall löscht ein Nutzer Anmeldedaten auf dem Server, lässt aber den Passkey beim Passkey-Anbieter unverändert. Wenn sich der Nutzer das nächste Mal mit einem Passkey anmeldet, wird ihm dieser Passkey vom Passkey-Anbieter weiterhin angezeigt. Der Anmeldeversuch schlägt jedoch fehl, da der Server die Anmeldung nicht mit dem gelöschten öffentlichen Schlüssel bestätigen kann.

Der zweite Fall ist, wenn ein Nutzer seinen Nutzernamen oder den Anzeigenamen auf dem Server aktualisiert. Wenn sich der Nutzer das nächste Mal anmeldet, werden im Passkey-Anbieter weiterhin der alte Nutzername und der alte Anzeigename angezeigt, obwohl sie auf dem Server aktualisiert wurden. Idealerweise sollten sie synchron sein.

Signal API

Die Signal API ist eine WebAuthn API, die diese Unklarheiten beseitigt, indem RPs Änderungen an den Passkey-Anbieter senden können. Es gibt drei Methoden:

Signalisieren, dass Anmeldedaten nicht vorhanden sind

const credential = await navigator.credentials.get({ ... });
const payload = credential.toJSON();

const result = await fetch('/login', { ... });

// Detect authentication failure due to lack of the credential
if (result.status === 404) {
  // Feature detection
  if (PublicKeyCredential.signalUnknownCredential) {
    await PublicKeyCredential.signalUnknownCredential({
      rpId: "example.com",
      credentialId: "vI0qOggiE3OT01ZRWBYz5l4MEgU0c7PmAA" // base64url encoded credential ID
    });
  } else {
    // Encourage the user to delete the passkey from the password manager nevertheless.
    ...
  }
}

Durch Aufrufen von PublicKeyCredential.signalUnknownCredential() mit einer RP-ID und einer Anmeldedaten-ID kann der RP den Passkey-Anbieter darüber informieren, dass die angegebenen Anmeldedaten entfernt wurden oder nicht vorhanden sind. Es liegt im Ermessen des Passkey-Anbieters, wie er mit diesem Signal umgeht. Der zugehörige Passkey wird jedoch voraussichtlich entfernt, damit sich der Nutzer nicht mit einem Passkey anmelden kann, da die zugehörigen Anmeldedaten nicht vorhanden sind.

Diese API kann aufgerufen werden, wenn eine passkeybasierte Anmeldung aufgrund fehlender Anmeldedaten fehlgeschlagen ist. So kann der RP verhindern, dass der Nutzer versucht, sich mit einem Passkey anzumelden, der nicht mit Anmeldedaten verknüpft ist. Im Gegensatz zu signalAllAcceptedCredentials muss bei dieser Methode nicht die gesamte Liste der Anmeldedaten-IDs übergeben werden. Sie sollte daher immer verwendet werden, wenn der Nutzer nicht authentifiziert ist, um die Anzahl der Passkeys für einen bestimmten Nutzer nicht preiszugeben.

Ein Dialogfeld, das angezeigt wird, wenn ein Passkey aus dem Google Passwortmanager in Chrome gelöscht wird.
Dialogfeld, das angezeigt wird, wenn ein Passkey aus dem Google Passwortmanager in Chrome gelöscht wird.

Liste der gespeicherten Anmeldedaten signalisieren

// After a user deletes a passkey or a user is signed in.

// Feature detection
if (PublicKeyCredential.signalAllAcceptedCredentials) {
  await PublicKeyCredential.signalAllAcceptedCredentials({
    rpId: "example.com",
    userId: "M2YPl-KGnA8", // base64url encoded user ID
    allAcceptedCredentialIds: [ // A list of base64url encoded credential IDs
      "vI0qOggiE3OT01ZRWBYz5l4MEgU0c7PmAA",
      ...
    ]
  });
}

Durch Aufrufen von PublicKeyCredential.signalAllAcceptedCredentials() mit einer RP-ID, einer Nutzer-ID und einer Liste der Anmeldedaten-IDs der gespeicherten Anmeldedaten kann der RP den Passkey-Anbieter über die verbleibenden Anmeldedaten in seinem Speicher informieren. Wie mit diesem Signal umgegangen wird, liegt im Ermessen des Passkey-Anbieters. Passkeys, die nicht mit dieser Liste übereinstimmen, werden jedoch voraussichtlich entfernt, damit der Nutzer bei der Anmeldung keine Passkeys sieht, für die die zugehörigen Anmeldedaten nicht vorhanden sind.

Diese API sollte beim Löschen eines Passkeys auf dem RP und bei jeder Anmeldung aufgerufen werden, damit der Passkey-Anbieter eine synchronisierte Liste der Passkeys führen kann.

Signal für aktualisierten Nutzernamen und Anzeigenamen

// After a user updated their username and/or display name
// or a user is signed in.

// Feature detection
if (PublicKeyCredential.signalCurrentUserDetails) {
  await PublicKeyCredential.signalCurrentUserDetails({
    rpId: "example.com",
    userId: "M2YPl-KGnA8", // base64url encoded user ID
    name: "a.new.email.address@example.com", // username
    displayName: "J. Doe"
  });
} else {
}

Durch Aufrufen von PublicKeyCredential.signalCurrentUserDetails() mit einer RP-ID, einer Nutzer-ID, einem Nutzernamen und einem Anzeigenamen kann der RP den Passkey-Anbieter über die aktualisierten Nutzerinformationen informieren. Es liegt im Ermessen des Passkey-Anbieters, wie er mit diesem Signal umgeht. Die Passkeys des Nutzers werden jedoch voraussichtlich mit den neuen Nutzerinformationen aktualisiert.

Diese API kann bei der Aktualisierung des Nutzernamens oder Anzeigenamens und bei jeder Anmeldung aufgerufen werden, damit der Passkey-Anbieter diese Informationen mit dem Server synchronisieren kann.

Ein Dialogfeld, das angezeigt wird, wenn die Metadaten eines Passkeys im Google Passwortmanager in Chrome aktualisiert werden.
Dialogfeld, das angezeigt wird, wenn die Metadaten eines Passkeys im Google Passwortmanager in Chrome aktualisiert werden.

Zusammenfassung

Mit der Signal API können Sie Passkeys noch besser nutzen, da die Wahrscheinlichkeit unerwarteter Anmeldefehler sinkt. Mit der Signal API können vertrauende Seiten die Liste der vorhandenen Anmeldedaten und deren Metadaten signalisieren, um Passkeys beim Passkey-Anbieter synchron zu halten.

Weitere Informationen zu Passkeys finden Sie unter Anmeldung ohne Passwort mit Passkeys.