Start · Sprachen · JavaScript · Referenz · AuthenticatorAttestationResponse.getTransports()

AuthenticatorAttestationResponse.getTransports()

Methode

Gibt ein Array von Zeichenfolgen zurück, das die Transportwege beschreibt (z. B. <code>"usb"</code>, <code>"internal"</code>, <code>"hybrid"</code>), über die der Authenticator erreichbar ist.

seit JavaScript WebAuthn Level 2; Baseline 2023 (Chrome 74+, Edge Kategorie: webapi

Signatur

AuthenticatorAttestationResponse.prototype.getTransports()

Beschreibung

Die Methode getTransports() gehört zur Schnittstelle AuthenticatorAttestationResponse. Diese erhält man bei der Registrierung eines neuen WebAuthn-Credentials (Passkey, Sicherheitsschlüssel) über navigator.credentials.create() als credential.response. Die Methode liefert, über welche Wege der Authenticator mit dem Client kommunizieren kann.

Mögliche Werte sind unter anderem:

  • "usb" – per USB angeschlossener Sicherheitsschlüssel
  • "nfc" – Near Field Communication
  • "ble" – Bluetooth Low Energy
  • "internal" – im Gerät verbauter Plattform-Authenticator (z. B. Touch ID, Windows Hello)
  • "hybrid" – geräteübergreifend, z. B. Smartphone per QR-Code und Bluetooth
  • "smart-card" – Smartcard

In der Praxis schickt man das Ergebnis zusammen mit der Credential-ID an den Server und speichert es dort. Bei einer späteren Anmeldung übergibt man die Werte dann im Feld transports der Einträge von allowCredentials an navigator.credentials.get(). So kann der Browser gleich den passenden Anmeldedialog anzeigen und muss nicht erst unnötig nach USB- oder Bluetooth-Geräten suchen.

Rückgabewert

Typ
string[]
Beschreibung
Ein lexikografisch sortiertes Array ohne Duplikate mit den Transportwegen des Authenticators. Kann leer sein, wenn der Browser die Transportwege nicht ermitteln kann.

Beispiele

Transportwege 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: 'max@example.com', displayName: 'Max' },
      pubKeyCredParams: [{ type: 'public-key', alg: -7 }]
    }
  });

  const transports = credential.response.getTransports();
  console.log('Transportwege:', transports);
  return credential;
};
Transportwege: ["hybrid", "internal"]

Transportwege zusammen mit dem Credential an den Server senden

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

const sendRegistration = async (credential) => {
  const { response } = credential;
  const payload = {
    id: credential.id,
    clientDataJSON: toBase64Url(response.clientDataJSON),
    attestationObject: toBase64Url(response.attestationObject),
    // Fallback für ältere Browser ohne getTransports()
    transports: typeof response.getTransports === 'function'
      ? response.getTransports()
      : []
  };

  const res = await fetch('/api/webauthn/register', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(payload)
  });
  return res.ok;
};

Gespeicherte Transportwege bei der Anmeldung nutzen

// storedCredentials kommt vom Server, z. B.:
// [{ id: Uint8Array, transports: ['usb', 'nfc'] }]
const login = async (challenge, storedCredentials) => {
  const assertion = await navigator.credentials.get({
    publicKey: {
      challenge,
      allowCredentials: storedCredentials.map(({ id, transports }) => ({
        type: 'public-key',
        id,
        transports // Browser zeigt gezielt den passenden Dialog
      })),
      userVerification: 'preferred'
    }
  });
  console.log('Angemeldet mit:', assertion.id);
  return assertion;
};
Angemeldet mit: <Credential-ID>

// Wichtig · Fallstricke

  • Nur ein Hinweis, keine Sicherheitsgarantie: Die Werte kommen vom Client und sind nicht kryptografisch abgesichert. Verwende sie auf keinen Fall für Entscheidungen, bei denen es um Sicherheit geht, zum Beispiel „nur Hardware-Schlüssel zulassen“. Dafür ist die Attestation gedacht.
  • Browser-Kompatibilität: Firefox unterstützt die Methode erst seit Version 119, ältere Browser kennen sie gar nicht. Prüfe deshalb vorher mit typeof response.getTransports === 'function'. Unbekannte Werte, etwa neue Transportwege aus späteren Versionen der Spezifikation, solltest du tolerieren und unverändert speichern.
  • Das Array kann leer sein. In diesem Fall lässt du transports in allowCredentials am besten ganz weg, statt ein leeres Array zu übergeben.
  • Die Methode gibt es nur auf AuthenticatorAttestationResponse (Registrierung). Bei AuthenticatorAssertionResponse (Anmeldung) fehlt sie.
  • WebAuthn funktioniert nur in einem sicheren Kontext (HTTPS oder localhost).