Start · Sprachen · JavaScript · Referenz · Credential.isConditionalMediationAvailable()

Credential.isConditionalMediationAvailable()

Methode

Statische Methode der Basisschnittstelle <code>Credential</code>, die immer ein Promise zurückgibt, das sich zu <code>false</code> auflöst.

seit JavaScript Nicht Baseline: nur in einigen Browsern (Chromium- Kategorie: webapi

Signatur

Credential.isConditionalMediationAvailable()

Beschreibung

Die statische Methode Credential.isConditionalMediationAvailable() gehört zur Credential Management API. Auf der Basisschnittstelle Credential gibt sie immer ein Promise zurück, das sich zu false auflöst. Sie ist die Standardimplementierung, die abgeleitete Klassen überschreiben können.

Die eigentlich interessante Variante ist PublicKeyCredential.isConditionalMediationAvailable(). Sie meldet, ob der Browser Conditional Mediation unterstützt. Gemeint ist das Autofill von Passkeys: Gespeicherte WebAuthn-Zugangsdaten werden direkt in der Vorschlagsliste eines Eingabefelds mit autocomplete="username webauthn" angeboten, sobald navigator.credentials.get({ mediation: "conditional" }) aufgerufen wird.

Durch die Methode auf der Basisklasse kann generischer Code auf jeder Credential-Unterklasse die gleiche Prüfung aufrufen, ohne vorher abzufragen, ob die Methode existiert. Klassen ohne eigene Unterstützung für Conditional Mediation liefern dann einfach false.

In der Praxis rufst du für Passkey-Autofill fast immer PublicKeyCredential.isConditionalMediationAvailable() auf. Die Basismethode ist vor allem für polymorphen oder generischen Code gedacht.

Rückgabewert

Typ
Promise<boolean>
Beschreibung
Ein Promise, das sich auf der Basisklasse Credential immer zu false auflöst. Unterklassen wie PublicKeyCredential können true liefern, wenn Conditional Mediation unterstützt wird.

Beispiele

Basismethode direkt aufrufen

const pruefeBasis = async () => {
  if (typeof Credential?.isConditionalMediationAvailable !== "function") {
    console.log("Methode wird nicht unterstützt");
    return;
  }
  const verfuegbar = await Credential.isConditionalMediationAvailable();
  console.log("Credential:", verfuegbar);
};

pruefeBasis();
Credential: false

Basisklasse und PublicKeyCredential vergleichen

const vergleiche = async () => {
  const klassen = ["Credential", "PublicKeyCredential", "PasswordCredential"];
  for (const name of klassen) {
    const Klasse = globalThis[name];
    if (typeof Klasse?.isConditionalMediationAvailable !== "function") {
      console.log(`${name}: nicht verfügbar`);
      continue;
    }
    console.log(`${name}:`, await Klasse.isConditionalMediationAvailable());
  }
};

vergleiche();
Credential: false PublicKeyCredential: true PasswordCredential: false (je nach Browser unterschiedlich)

Passkey-Autofill nur bei Unterstützung starten

// HTML: <input name="user" autocomplete="username webauthn">
const starteAutofill = async (challenge) => {
  const unterstuetzt =
    typeof PublicKeyCredential?.isConditionalMediationAvailable === "function" &&
    (await PublicKeyCredential.isConditionalMediationAvailable());

  if (!unterstuetzt) {
    console.log("Kein Passkey-Autofill – klassisches Login anzeigen");
    return null;
  }

  // challenge: Uint8Array vom Server
  const credential = await navigator.credentials.get({
    mediation: "conditional",
    publicKey: { challenge, userVerification: "preferred" }
  });
  console.log("Angemeldet mit Passkey:", credential.id);
  return credential;
};

starteAutofill(crypto.getRandomValues(new Uint8Array(32)));
Angemeldet mit Passkey: <Credential-ID> (bzw. Hinweis auf das klassische Login)

// Wichtig · Fallstricke

  • Immer false: Auf der Basisklasse Credential liefert die Methode grundsätzlich false. Für die Erkennung von Passkey-Autofill brauchst du PublicKeyCredential.isConditionalMediationAvailable().
  • Browser-Kompatibilität: Die statische Methode auf Credential gibt es noch nicht in allen Browsern. Prüfe sie vor dem Aufruf mit typeof … === "function". Sonst wirft der Aufruf einen TypeError.
  • Sicherer Kontext: Die Credential Management API steht nur unter HTTPS (bzw. localhost) zur Verfügung.
  • Das Promise wird nie verworfen, sondern immer mit einem Boolean erfüllt. Trotzdem gehört await dazu. Ein unaufgelöstes Promise ist immer truthy, ein if (Credential.isConditionalMediationAvailable()) ohne await ist also ein häufiger Fehler.