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

Veröffentlicht am 12. November 2024, zuletzt aktualisiert am 29. November 2024

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

Kompatibilität

Chrome unterstützt die Signal API auf allen Desktop-Plattformen und unter Android.

Safari wird unterstützt, ist aber noch nicht implementiert. Firefox hat noch keine Meinung dazu geäußert.

Der Google Passwortmanager kann Passkeys aktualisieren, um das Signal zu berücksichtigen. Chrome-Erweiterungen für Passkeys auf dem Computer entscheiden, ob das Signal berücksichtigt wird.

Hintergrund

Wenn ein Passkey (auffindbare Anmeldedaten) 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 (Relying Party, RP) gespeichert. Wenn Nutzer den Nutzernamen und den Anzeigenamen speichern, können sie leichter erkennen, welche angebotenen Passkeys sie für die Anmeldung verwenden sollen, wenn sie dazu aufgefordert werden. Das ist besonders nützlich, wenn Nutzer mehr als zwei Passkeys von verschiedenen Passkey-Anbietern haben.

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

Der erste Fall liegt vor, wenn ein Nutzer Anmeldedaten auf dem Server löscht. Der Passkey bleibt beim Passkey-Anbieter unverändert. Wenn der Nutzer das nächste Mal versucht, sich mit einem Passkey anzumelden, wird ihm dieser Passkey vom Passkey-Anbieter weiterhin präsentiert. Der Anmeldeversuch schlägt jedoch fehl, da der Server den gelöschten öffentlichen Schlüssel nicht überprüfen kann.

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

Signal API

Die Signal API ist eine WebAuthn API, die diese Inkonsistenzen behebt, indem sie es RPs ermöglicht, Änderungen an den Passkey-Anbieter zu signalisieren. Es gibt drei Methoden:

Signal, 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. Der Passkey-Anbieter legt fest, wie dieses Signal behandelt wird. Der zugehörige Passkey sollte jedoch entfernt werden, damit Nutzer nicht versuchen, sich mit einem Passkey anzumelden, dem keine Anmeldedaten zugeordnet sind.

Browser Support

  • Chrome: 132.
  • Edge: 132.
  • Firefox: not supported.
  • Safari: 26.

Source

Diese API kann aufgerufen werden, wenn die passkeybasierte Anmeldung fehlgeschlagen ist, weil keine Anmeldedaten vorhanden sind. So kann der RP verhindern, dass Nutzer versuchen, sich mit einem Passkey anzumelden, dem keine Anmeldedaten zugeordnet sind. Anders als bei signalAllAcceptedCredentials müssen Sie bei dieser Methode nicht die gesamte Liste der Anmeldedaten-IDs übergeben. Verwenden Sie sie daher immer, 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 im Google Passwortmanager in Chrome gelöscht wird.
Ein Dialogfeld, das angezeigt wird, wenn ein Passkey im Google Passwortmanager in Chrome gelöscht wird.

Liste gespeicherter 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",
      ...
    ]
  });
}

Verwenden Sie PublicKeyCredential.signalAllAcceptedCredentials(), nachdem sich ein Nutzer angemeldet oder Kontoeinstellungen verwaltet hat. Sie geben eine Liste aller gültigen Anmeldedaten-IDs für diesen Nutzer an. Der Passkey-Anbieter vergleicht diese Liste mit seinem lokalen Speicher für die vertrauende Partei. Der Passkey-Anbieter markiert alle Passkeys, die in seinem Speicher gefunden werden und nicht in der Liste allAcceptedCredentialIds enthalten sind, als „verborgen“. Das System bietet diese verborgenen Passkeys nicht mehr für die Anmeldung oder das automatische Ausfüllen an. Sie werden jedoch nicht sofort endgültig gelöscht, sodass sie bei Bedarf wiederhergestellt werden können. Umgekehrt stellt der Passkey-Anbieter Passkeys wieder her, die in allAcceptedCredentialIds vorhanden und als „verborgen“ markiert sind. So kann Ihre Website Passkeys wiederherstellen, die fälschlicherweise ausgeblendet wurden.

Browser Support

  • Chrome: 132.
  • Edge: 132.
  • Firefox: not supported.
  • Safari: 26.

Source

Rufen Sie diese API auf, wenn ein Nutzer einen Passkey beim RP löscht und bei jeder Anmeldung, damit der Passkey-Anbieter eine synchronisierte Liste von Passkeys führen kann.

Lesen Sie die Erläuterungen zum Ausblenden und Wiederherstellen von Passkeys.

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. Der Passkey-Anbieter legt fest, wie dieses Signal verarbeitet wird. Er sollte die Passkeys des Nutzers jedoch mit den neuen Nutzerinformationen aktualisieren.

Browser Support

  • Chrome: 132.
  • Edge: 132.
  • Firefox: not supported.
  • Safari: 26.

Source

Diese API kann aufgerufen werden, wenn der Nutzername oder Anzeigename des Nutzers aktualisiert wird, und bei jeder Anmeldung, 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.
Ein Dialogfeld, das angezeigt wird, wenn Passkey-Metadaten im Google Passwortmanager in Chrome aktualisiert werden.

Zusammenfassung

Mit der Signal API können Sie die Nutzung von Passkeys verbessern, indem Sie unerwartete Anmeldefehler vermeiden. Mit der Signal API können sich verlassene Parteien die Liste der vorhandenen Anmeldedaten und deren Metadaten signalisieren lassen, damit sie Passkeys beim Passkey-Anbieter synchronisieren können.

Weitere Informationen zu Passkeys