Signatur
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
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();
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);
// 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:
userIdund die IDs müssen Base64URL-Strings sein, keineArrayBuffer. Falsche Kodierung führt zu einemTypeError. Verwechseln SieuserIdnicht 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 einenSecurityErroraus. 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.