Start · Sprachen · JavaScript · Referenz · PublicKeyCredential.authenticatorAttachment

PublicKeyCredential.authenticatorAttachment

Eigenschaft

Schreibgeschützter String, der angibt, ob beim Erzeugen oder Abrufen des Credentials ein fest eingebauter (<code>"platform"</code>) oder ein externer (<code>"cross-platform"</code>) Authentifikator genutzt wurde.

seit JavaScript WebAuthn Level 3 – Chrome 108+, Edge 108+, Safari Kategorie: webapi

Signatur

PublicKeyCredential.authenticatorAttachment

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

Typ
"platform" | "cross-platform" | null
Beschreibung
Die Kategorie des verwendeten Authentifikators oder 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;
};
Authentifikator: platform

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.');
  }
};
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.authenticatorAttachment in den Optionen von create(). 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 null sein. Ältere Browser kennen die Eigenschaft gar nicht und liefern dann undefined. Deshalb immer mit einem Fallback wie ?? null arbeiten.
  • Nur in sicheren Kontexten (HTTPS) verfügbar.