Start · Sprachen · JavaScript · Referenz · IdentityProvider.close()

IdentityProvider.close()

Methode

Teilt dem Browser von der Login-Seite eines Identitätsanbieters (IdP) aus mit, dass der Anmeldevorgang abgeschlossen ist und das FedCM-Anmeldefenster geschlossen werden kann.

seit JavaScript Experimentell: Chrome/Edge 120+ (FedCM); nicht in Kategorie: webapi

Signatur

IdentityProvider.close()

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

Typ
void
Beschreibung
Kein 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));
Erfolg: true

// 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 Header Set-Login: logged-in, und rufe erst danach close() 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 postMessage an unbekannte Ursprünge gehen.