Signatur
Beschreibung
Die schreibgeschützte Eigenschaft authenticatorAttachment eines PublicKeyCredential zeigt an, welche Art von Authentifikator beim zugehörigen Aufruf von navigator.credentials.create() oder navigator.credentials.get() verwendet wurde. Mögliche Werte sind:
"platform"– ein im Gerät verbauter Authentifikator, etwa Windows Hello, Touch ID/Face ID oder der Android-Fingerabdrucksensor."cross-platform"– ein externer Authentifikator, der über USB, NFC oder Bluetooth angebunden ist, z. B. ein YubiKey. Auch die geräteübergreifende Anmeldung per Smartphone (Hybrid-Transport, QR-Code) fällt darunter.null– der Browser kann oder will die Kategorie nicht angeben.
Nützlich ist die Eigenschaft vor allem für die Nutzerführung nach der Anmeldung. Hat sich jemand z. B. per Smartphone über QR-Code ("cross-platform") angemeldet, kann die Website anschließend anbieten, zusätzlich einen Passkey direkt auf dem aktuellen Gerät ("platform") anzulegen. So klappt die nächste Anmeldung schneller.
Der Wert wird auch in PublicKeyCredential.toJSON() übernommen und kann an den Server geschickt werden, damit dort gespeichert wird, welche Art von Authentifikator ein Credential nutzt. Für sicherheitskritische Entscheidungen ist er aber nicht gedacht, denn er wird vom Client geliefert und ist nicht kryptografisch signiert.
Rückgabewert
null, wenn der Browser sie nicht angibt.Beispiele
Authentifikator-Typ nach der Registrierung auslesen
const registerPasskey = async (challenge, userId) => {
const credential = await navigator.credentials.create({
publicKey: {
challenge, // Uint8Array vom Server
rp: { name: 'Beispiel GmbH' },
user: { id: userId, name: 'anna@example.com', displayName: 'Anna' },
pubKeyCredParams: [{ type: 'public-key', alg: -7 }],
authenticatorSelection: { residentKey: 'preferred' }
}
});
console.log('Authentifikator:', credential.authenticatorAttachment);
return credential;
};
Nach Anmeldung per Smartphone einen lokalen Passkey anbieten
const signIn = async (challenge) => {
const assertion = await navigator.credentials.get({
publicKey: { challenge, userVerification: 'preferred' }
});
// ... Assertion an den Server senden und prüfen ...
const hasLocalAuthenticator =
await PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable();
if (assertion.authenticatorAttachment === 'cross-platform' && hasLocalAuthenticator) {
console.log('Tipp: Passkey auf diesem Gerät speichern, damit die nächste Anmeldung schneller geht.');
}
};
Wert an den Server übermitteln (mit Fallback)
const sendCredential = async (credential) => {
const payload = typeof credential.toJSON === 'function'
? credential.toJSON() // enthält authenticatorAttachment
: {
id: credential.id,
type: credential.type,
authenticatorAttachment: credential.authenticatorAttachment ?? null
};
await fetch('/webauthn/register', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
};
// Wichtig · Fallstricke
- Nicht vertrauenswürdig: Der Wert kommt vom Browser und ist nicht Teil der signierten Authentifikator-Daten. Richtlinien wie „nur Hardware-Schlüssel erlaubt“ gehören serverseitig über Attestation (AAGUID) geprüft.
- Nicht verwechseln mit
authenticatorSelection.authenticatorAttachmentin den Optionen voncreate(). Dort ist es eine Vorgabe, hier das tatsächliche Ergebnis. - Synchronisierte Passkeys (iCloud-Schlüsselbund, Google-Passwortmanager) melden sich lokal als
"platform". Beim Zugriff über ein anderes Gerät per QR-Code liefert die Eigenschaft dagegen"cross-platform". - Der Wert kann
nullsein. Ältere Browser kennen die Eigenschaft gar nicht und liefern dannundefined. Deshalb immer mit einem Fallback wie?? nullarbeiten. - Nur in sicheren Kontexten (HTTPS) verfügbar.