Signatur
Beschreibung
IdentityProvider.close() ist eine statische Methode der Federated Credential Management API (FedCM). Sie wird nicht auf der Seite des vertrauenden Dienstes (Relying Party, RP) aufgerufen, sondern auf der Login-Seite des Identitätsanbieters. Diese Seite öffnet der Browser in einem Popup bzw. Dialog, wenn ein Nutzer beim IdP noch nicht angemeldet ist und die RP navigator.credentials.get({ identity: … }) aufruft. Die Adresse der Seite steht als login_url in der Konfigurationsdatei des IdP.
Hat sich der Nutzer im Popup erfolgreich angemeldet, muss der Browser das erfahren, damit er das Fenster schließt und den FedCM-Ablauf fortsetzt: Er ruft die Konten neu ab und zeigt die Kontoauswahl an. Genau dafür ist IdentityProvider.close() da, als manuelles Signal „Anmeldung fertig“. Normalerweise setzt man vorher mit navigator.login.setStatus("logged-in") den Login-Status (oder schickt alternativ den HTTP-Header Set-Login: logged-in). Nur dann weiß der Browser, dass jetzt Konten verfügbar sind.
Die Methode hat keine Parameter und gibt undefined zurück. Sie ist nur in einem FedCM-Login-Kontext sinnvoll. Ruft man sie in einem normalen Browser-Tab auf, passiert nichts.
Rückgabewert
undefined). Als Nebeneffekt schließt der Browser das FedCM-Anmeldefenster und setzt den Ablauf fort.Beispiele
Login-Formular im IdP-Popup abschließen
// Läuft auf der login_url-Seite des Identitätsanbieters
const form = document.querySelector('#login-form');
form.addEventListener('submit', async (event) => {
event.preventDefault();
const response = await fetch('/api/login', {
method: 'POST',
body: new FormData(form),
credentials: 'include'
});
if (!response.ok) {
document.querySelector('#error').textContent = 'Anmeldung fehlgeschlagen';
return;
}
// 1. Browser mitteilen: Nutzer ist jetzt beim IdP angemeldet
await navigator.login.setStatus('logged-in');
// 2. Anmeldefenster schließen, FedCM zeigt danach die Kontoauswahl
IdentityProvider.close();
});
Mit Feature-Erkennung und Rückfall auf window.close()
const finishLogin = async () => {
if ('IdentityProvider' in window && typeof IdentityProvider.close === 'function') {
if (navigator.login?.setStatus) {
await navigator.login.setStatus('logged-in');
}
IdentityProvider.close();
} else if (window.opener) {
// Klassischer Popup-Ablauf ohne FedCM
window.opener.postMessage({ type: 'login-done' }, 'https://rp.example');
window.close();
} else {
location.href = '/konto';
}
};
document.querySelector('#weiter').addEventListener('click', finishLogin);
Login-Status per HTTP-Header, Schließen per JavaScript
// Server-Antwort auf POST /api/login enthält bereits:
// Set-Login: logged-in
// Deshalb reicht im Client das Schließen des Fensters.
const login = async (credentials) => {
const res = await fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(credentials),
credentials: 'include'
});
if (res.ok) IdentityProvider.close();
return res.ok;
};
login({ user: 'anna', password: 'geheim' }).then((ok) => console.log('Erfolg:', ok));
// Wichtig · Fallstricke
- Kompatibilität: Die Methode ist experimentell und bisher nur in Chromium-Browsern (Chrome, Edge) mit FedCM und Login-Status-API verfügbar. Firefox und Safari unterstützen sie nicht. Prüfe deshalb immer per Feature-Erkennung, ob sie vorhanden ist.
- Reihenfolge beachten: Setze den Login-Status zuerst, mit
navigator.login.setStatus('logged-in')oder dem HeaderSet-Login: logged-in, und rufe erst danachclose()auf. Sonst hält der Browser den Nutzer weiter für abgemeldet, und der FedCM-Ablauf bricht ab oder öffnet die Login-Seite erneut. - Richtiger Kontext: Die Methode wirkt nur auf der Seite, die der Browser als FedCM-Login-Fenster (
login_url) geöffnet hat. In normalen Tabs oder auf der Seite der RP passiert nichts, und es gibt auch keine Fehlermeldung. - Nicht mit
window.close()verwechseln:window.close()schließt nur das Fenster und gibt dem FedCM-Ablauf kein Signal zum Weitermachen. - Die Login-Seite muss vom selben Ursprung stammen wie die IdP-Konfiguration. Hier sollten keine vertraulichen Daten per
postMessagean unbekannte Ursprünge gehen.