Start · Sprachen · JavaScript · Referenz · PublicKeyCredential.signalAllAcceptedCredentials()

PublicKeyCredential.signalAllAcceptedCredentials()

Methode

Teilt dem Authentifikator die vollständige Liste der Credential-IDs mit, die der RP-Server für einen Benutzer noch akzeptiert, damit veraltete Passkeys ausgeblendet werden.

seit JavaScript WebAuthn Level 3 (Signal API) – Chrome/Edge 132+, Kategorie: webapi

Signatur

PublicKeyCredential.signalAllAcceptedCredentials(options)

Beschreibung

Die statische Methode PublicKeyCredential.signalAllAcceptedCredentials() gehört zur WebAuthn Signal API. Mit ihr meldet die Relying Party (RP) dem Passkey-Anbieter (z. B. Google Passwortmanager, iCloud-Schlüsselbund, Windows Hello), welche Credential-IDs für einen bestimmten Benutzer auf dem Server noch gültig sind. Passkeys dieses Benutzers für diese rpId, die nicht in der Liste stehen, kann der Authentifikator daraufhin ausblenden oder entfernen.

Typischer Anwendungsfall: Ein Benutzer löscht einen Passkey in den Kontoeinstellungen Ihrer Website. Ohne Signal bliebe der Passkey im Passwortmanager erhalten und würde bei der nächsten Anmeldung weiterhin angeboten – mit einem Fehlschlag als Ergebnis. Rufen Sie die Methode daher nach einer erfolgreichen Anmeldung und nach jeder Änderung an der Passkey-Liste auf, um Server und Authentifikator synchron zu halten.

Die Methode liefert ein Promise, das sofort nach der Validierung der Eingaben erfüllt wird. Ob und wann der Authentifikator das Signal tatsächlich verarbeitet, erfährt die Website bewusst nicht (Schutz der Privatsphäre). Es erscheint keine Benutzeroberfläche, und eine Benutzergeste ist nicht erforderlich.

Wichtig ist, dass die Liste vollständig sein muss: Jede fehlende ID wird als nicht mehr akzeptiert interpretiert. Für das Melden einer einzelnen unbekannten ID eignet sich stattdessen PublicKeyCredential.signalUnknownCredential().

Parameter

Name Typ Default Beschreibung
$options Pflicht Object Konfigurationsobjekt mit den folgenden drei Pflichteigenschaften.
$options.rpId Pflicht string ID der Relying Party, z. B. "example.com". Muss der aktuellen Origin entsprechen oder ein registrierbares Domain-Suffix davon sein.
$options.userId Pflicht string Base64URL-kodierte Benutzer-ID (user.id aus der Registrierung), nicht der Benutzername.
$options.allAcceptedCredentialIds Pflicht Array<string> Array aller Base64URL-kodierten Credential-IDs, die der Server für diesen Benutzer noch akzeptiert. Ein leeres Array signalisiert, dass keine Passkeys mehr gültig sind.

Rückgabewert

Typ
Promise<undefined>
Beschreibung
Ein Promise, das mit undefined erfüllt wird, sobald das Signal angenommen wurde. Es wird mit einem SecurityError (ungültige rpId) oder TypeError (ungültiges Base64URL in userId bzw. den IDs) abgelehnt.

Beispiele

Nach erfolgreicher Anmeldung synchronisieren

// Nach dem Login liefert der Server die aktuell gültigen Passkeys
const syncPasskeys = async () => {
  if (!PublicKeyCredential.signalAllAcceptedCredentials) {
    console.log('Signal API nicht verfügbar');
    return;
  }
  const res = await fetch('/api/passkeys/accepted');
  const { userId, credentialIds } = await res.json(); // Base64URL-Strings

  await PublicKeyCredential.signalAllAcceptedCredentials({
    rpId: 'example.com',
    userId,
    allAcceptedCredentialIds: credentialIds
  });
  console.log('Passkey-Liste synchronisiert');
};

syncPasskeys();
Passkey-Liste synchronisiert

Nach dem Löschen eines Passkeys in den Kontoeinstellungen

const deletePasskey = async (credentialId) => {
  // 1. Passkey serverseitig entfernen
  const res = await fetch(`/api/passkeys/${credentialId}`, { method: 'DELETE' });
  const { userId, remainingIds } = await res.json();

  // 2. Authentifikator über die verbleibenden IDs informieren
  try {
    await PublicKeyCredential.signalAllAcceptedCredentials?.({
      rpId: location.hostname,
      userId,
      allAcceptedCredentialIds: remainingIds
    });
  } catch (err) {
    console.warn('Signal fehlgeschlagen:', err.name);
  }
};

ArrayBuffer-IDs in Base64URL umwandeln

// Hilfsfunktion: ArrayBuffer -> Base64URL (ohne Padding)
const toBase64Url = (buffer) =>
  btoa(String.fromCharCode(...new Uint8Array(buffer)))
    .replace(/\+/g, '-')
    .replace(/\//g, '_')
    .replace(/=+$/, '');

const userIdBytes = new TextEncoder().encode('user-4711');
const credBytes = new Uint8Array([1, 2, 3, 250, 251, 252]);

const options = {
  rpId: 'example.com',
  userId: toBase64Url(userIdBytes),
  allAcceptedCredentialIds: [toBase64Url(credBytes.buffer)]
};
console.log(options);

// Auf example.com ausführen:
// await PublicKeyCredential.signalAllAcceptedCredentials(options);
{ rpId: 'example.com', userId: 'dXNlci00NzEx', allAcceptedCredentialIds: ['AQID-vv8'] }

// Wichtig · Fallstricke

  • Liste muss vollständig sein: Jede nicht aufgeführte Credential-ID dieses Benutzers kann vom Authentifikator ausgeblendet oder gelöscht werden. Eine fehlerhafte oder unvollständige Serverantwort (z. B. Paginierung, Datenbankfehler) kann so gültige Passkeys unbrauchbar machen – senden Sie im Fehlerfall lieber gar kein Signal.
  • Kodierung: userId und die IDs müssen Base64URL-Strings sein, keine ArrayBuffer. Falsche Kodierung führt zu einem TypeError. Verwechseln Sie userId nicht mit dem Benutzernamen.
  • Keine Rückmeldung: Ein erfülltes Promise bedeutet nicht, dass der Authentifikator etwas geändert hat. Die Verarbeitung ist optional und für die Website nicht beobachtbar.
  • Sicherheit: Nur im sicheren Kontext (HTTPS) verfügbar; eine rpId, die nicht zur aktuellen Origin passt, löst einen SecurityError aus. Rufen Sie die Methode nur auf, wenn der Benutzer angemeldet ist.
  • Kompatibilität: Neue API (Chromium 132+, Safari 26+), in Firefox bisher nicht verfügbar. Immer per Feature-Erkennung prüfen: if (PublicKeyCredential.signalAllAcceptedCredentials) { … }. Nicht jeder Passkey-Anbieter wertet das Signal aus.