Start · Sprachen · JavaScript · Referenz · IdentityCredential.token

IdentityCredential.token

Eigenschaft

Die schreibgeschützte Eigenschaft <code>token</code> liefert das vom Identity Provider ausgestellte Token, mit dem die Relying Party eine FedCM-Anmeldung serverseitig prüft.

seit JavaScript FedCM API – Chromium-basierte Browser (Chrome/Edge Kategorie: webapi

Signatur

IdentityCredential.token

Beschreibung

Die Eigenschaft token gehört zum Interface IdentityCredential der Federated Credential Management API (FedCM). Nach einem erfolgreichen Aufruf von navigator.credentials.get({ identity: … }) enthält sie das Token, das der Identity Provider (IdP) über seinen ID-Assertion-Endpunkt (id_assertion_endpoint) zurückgegeben hat.

Das Format legt allein der IdP fest. Meist ist es ein signiertes JWT (z. B. ein OpenID-Connect-ID-Token), es kann aber auch ein Autorisierungscode oder ein anderes Format sein. Für den Browser ist das Token nur eine Zeichenkette, er wertet sie nicht aus.

Üblicherweise schickt die Relying Party (RP) das Token direkt an das eigene Backend. Dort wird es geprüft: Signatur, Aussteller (iss), Zielgruppe (aud = eigene Client-ID), Ablaufzeit und nonce. Erst danach wird eine Sitzung angelegt. Wenn man dem Token nur im Client vertraut, lässt sich die Anmeldung fälschen.

Rückgabewert

Typ
string
Beschreibung
Das vom IdP ausgestellte Token als Zeichenkette, schreibgeschützt. Das Format bestimmt der IdP, oft ist es ein JWT.

Beispiele

Anmeldung per FedCM und Token auslesen

const signIn = async () => {
  const credential = await navigator.credentials.get({
    identity: {
      providers: [{
        configURL: 'https://idp.example/fedcm.json',
        clientId: 'meine-client-id',
        nonce: crypto.randomUUID()
      }]
    }
  });

  // credential ist ein IdentityCredential
  console.log(credential.type);
  console.log(typeof credential.token);
  return credential.token;
};

signIn().catch((err) => console.error('Anmeldung fehlgeschlagen:', err));
identity string

Token zur Prüfung an das eigene Backend senden

const loginWithIdp = async () => {
  const nonce = crypto.randomUUID();
  sessionStorage.setItem('fedcm-nonce', nonce);

  const { token } = await navigator.credentials.get({
    identity: {
      providers: [{
        configURL: 'https://idp.example/fedcm.json',
        clientId: 'meine-client-id',
        nonce
      }]
    }
  });

  const res = await fetch('/api/auth/fedcm', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    credentials: 'same-origin',
    body: JSON.stringify({ token, nonce })
  });

  if (!res.ok) throw new Error('Token wurde vom Server abgelehnt');
  return res.json();
};

Feature-Erkennung und Rückfall auf klassischen Login

const startLogin = async () => {
  if (!('IdentityCredential' in window)) {
    // Browser kennt FedCM nicht: klassischer Redirect-Flow
    location.href = '/login/oauth';
    return;
  }
  try {
    const cred = await navigator.credentials.get({
      identity: {
        providers: [{ configURL: 'https://idp.example/fedcm.json', clientId: 'meine-client-id' }]
      }
    });
    console.log('Token-Länge:', cred.token.length);
  } catch (err) {
    // z. B. NetworkError, wenn der Nutzer den Dialog schließt
    console.warn('FedCM abgebrochen:', err.name);
  }
};

startLogin();
Token-Länge: 812

// Wichtig · Fallstricke

  • Kompatibilität: FedCM gibt es derzeit vor allem in Chromium-Browsern (Chrome, Edge, Opera). Firefox und Safari unterstützen die API nicht oder nur hinter Flags. Deshalb vorher mit 'IdentityCredential' in window prüfen und einen anderen Login-Weg anbieten.
  • Nur in sicherem Kontext: Die API steht ausschließlich unter HTTPS bereit. In iframes muss die Permissions-Policy identity-credentials-get erlaubt sein.
  • Sicherheit: Das Token muss immer serverseitig geprüft werden: Signatur, iss, aud, exp und die übergebene nonce. So werden Replay- und Fälschungsangriffe verhindert. Das Token ist ein Geheimnis. Es gehört nicht in localStorage, nicht in Logs und nicht in URLs.
  • Das Format des Tokens ist nicht standardisiert und hängt vom IdP ab. Man sollte im Client nicht davon ausgehen, dass es ein JWT ist.
  • Die Eigenschaft ist schreibgeschützt. Eine Zuweisung bleibt ohne Wirkung und wirft im Strict Mode einen TypeError.
  • Die Spezifikation ändert sich noch. Parameter wie nonce werden in neueren Chrome-Versionen teils in params verschoben. Aktuelle Browser-Hinweise beachten.