Signatur
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
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));
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();
// 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 windowprü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-geterlaubt sein. - Sicherheit: Das Token muss immer serverseitig geprüft werden: Signatur,
iss,aud,expund die übergebenenonce. So werden Replay- und Fälschungsangriffe verhindert. Das Token ist ein Geheimnis. Es gehört nicht inlocalStorage, 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
noncewerden in neueren Chrome-Versionen teils inparamsverschoben. Aktuelle Browser-Hinweise beachten.