Start · Sprachen · JavaScript · Referenz · Credential

Credential

Schnittstelle

Basis-Interface der Credential Management API, das Anmeldedaten einer Entität (meist eines Benutzers) beschreibt, etwa Passwörter, Passkeys oder föderierte Identitäten.

seit JavaScript Baseline (teilweise): Chromium-Browser vollständig Kategorie: webapi

Signatur

interface Credential

Beschreibung

Credential ist das abstrakte Basis-Interface der Credential Management API. Es liefert Informationen über eine Entität, meist einen Benutzer. Der Browser braucht diese Informationen, bevor er eine Vertrauensentscheidung treffen kann, zum Beispiel bei einer Anmeldung. Direkt instanziieren lässt sich Credential nicht. Man arbeitet immer mit einer der Unterklassen:

  • PasswordCredential: Benutzername und Passwort, die im Passwortmanager des Browsers gespeichert sind
  • PublicKeyCredential: WebAuthn bzw. Passkeys mit asymmetrischer Kryptografie
  • IdentityCredential: föderierte Anmeldung über FedCM (z. B. „Mit Google anmelden“)
  • OTPCredential: Einmalcodes aus SMS (WebOTP API)
  • FederatedCredential: älteres Modell für föderierte Anmeldung, veraltet

Das Interface selbst hat nur zwei schreibgeschützte Eigenschaften. id ist ein string und identifiziert die Anmeldedaten, zum Beispiel über den Benutzernamen oder die Credential-ID. type ist ebenfalls ein string und nennt die Art: "password", "public-key", "identity", "otp" oder "federated". An type erkennt man, welche Unterklasse man vor sich hat.

Man bekommt Credential-Objekte nicht über einen Konstruktor, sondern über den CredentialsContainer unter navigator.credentials. Die Methode get() ruft vorhandene Anmeldedaten ab, create() legt neue an, und store() speichert Anmeldedaten im Browser. Typische Einsätze sind automatische Anmeldung, Passkey-Registrierung und föderierte Anmeldung ohne Drittanbieter-Cookies.

Parameter

Name Typ Default Beschreibung
$id string Schreibgeschützte Eigenschaft: Kennung der Anmeldedaten. Bei PasswordCredential meist der Benutzername, bei PublicKeyCredential die Base64url-codierte Credential-ID.
$type "password" | "public-key" | "identity" | "otp" | "federated" Schreibgeschützte Eigenschaft: Art der Anmeldedaten. Daran erkennt man die konkrete Unterklasse.

Rückgabewert

Typ
Credential
Beschreibung
Instanzen entstehen nur indirekt als Ergebnis von navigator.credentials.get() oder create(). Beide geben ein Promise<Credential | null> zurück.

Beispiele

Gespeicherte Anmeldedaten abrufen und nach Typ unterscheiden

const anmelden = async () => {
  if (!('credentials' in navigator)) {
    console.log('Credential Management API nicht verfügbar');
    return;
  }

  const cred = await navigator.credentials.get({
    password: true,
    mediation: 'optional'
  });

  if (!cred) {
    console.log('Keine Anmeldedaten ausgewählt');
    return;
  }

  console.log(cred instanceof Credential); // true
  console.log(cred.type, cred.id);

  if (cred.type === 'password') {
    await fetch('/api/login', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ user: cred.id, pass: cred.password })
    });
  }
};

anmelden();
true password max@example.com

Passwort nach erfolgreichem Login im Browser speichern

const form = document.querySelector('#login-form');

form.addEventListener('submit', async (event) => {
  event.preventDefault();
  const res = await fetch('/api/login', { method: 'POST', body: new FormData(form) });

  if (res.ok && 'PasswordCredential' in window) {
    // Erzeugt die Anmeldedaten direkt aus dem Formular (Felder brauchen autocomplete-Attribute)
    const cred = new PasswordCredential(form);
    await navigator.credentials.store(cred);
    console.log(`Gespeichert: ${cred.type} für ${cred.id}`);
  }
});
Gespeichert: password für max@example.com

Passkey anlegen (PublicKeyCredential)

const registrierePasskey = async () => {
  const cred = await navigator.credentials.create({
    publicKey: {
      challenge: crypto.getRandomValues(new Uint8Array(32)), // in der Praxis vom Server
      rp: { name: 'Beispiel GmbH' },
      user: {
        id: new TextEncoder().encode('user-42'),
        name: 'max@example.com',
        displayName: 'Max Muster'
      },
      pubKeyCredParams: [{ type: 'public-key', alg: -7 }]
    }
  });

  console.log(cred.type);        // 'public-key'
  console.log(typeof cred.id);   // 'string'
  return cred;
};

registrierePasskey().catch((err) => console.error(err.name, err.message));
public-key string

// Wichtig · Fallstricke

  • Kein eigener Konstruktor: new Credential() wirft einen TypeError. Man verwendet immer die Unterklassen oder navigator.credentials.
  • Nur in sicheren Kontexten: Die API funktioniert nur über HTTPS oder localhost. In Cross-Origin-iframes braucht sie zusätzlich die passende Permissions Policy, etwa publickey-credentials-get oder identity-credentials-get.
  • Browser-Kompatibilität: PublicKeyCredential (Passkeys) funktioniert in allen modernen Browsern. PasswordCredential und FederatedCredential gibt es praktisch nur in Chromium-Browsern. Vorher mit 'PasswordCredential' in window prüfen. FedCM (IdentityCredential) ist noch nicht überall verfügbar.
  • Veraltet: FederatedCredential gilt als überholt. Für föderierte Anmeldung besser FedCM verwenden.
  • Sicherheit: Ein Passwort aus PasswordCredential ist Klartext. Man schickt es nur über HTTPS und darf es nie loggen. Die Challenge bei WebAuthn muss vom Server kommen und dort geprüft werden. Eine im Client erzeugte Challenge taugt nur zu Demozwecken.
  • get() kann null liefern, etwa wenn der Benutzer abbricht oder keine Daten gespeichert sind. Diesen Fall immer abfangen.