Start · Sprachen · JavaScript · Referenz · NavigatorLogin.setStatus()

NavigatorLogin.setStatus()

Methode

Teilt dem Browser mit, ob der Nutzer beim föderierten Identitätsanbieter (IdP) angemeldet ist. Aufruf über <code>navigator.login.setStatus()</code> aus der IdP-Herkunft.

seit JavaScript Experimentell: Chromium-Browser (Chrome/Edge 120+) Kategorie: webapi

Signatur

NavigatorLogin.prototype.setStatus(status)

Beschreibung

setStatus() gehört zur Federated Credential Management API (FedCM), genauer zur Login-Status-API. Ein Identitätsanbieter (IdP), etwa ein „Mit X anmelden“-Dienst, meldet damit dem Browser, ob in dessen Browser gerade ein Nutzer angemeldet ist ("logged-in") oder nicht ("logged-out"). Die Methode wird über navigator.login.setStatus() aufgerufen und muss aus der Herkunft (Origin) des IdP kommen, also aus dem Hauptdokument des IdP oder aus einem iframe derselben Herkunft.

Der Browser speichert diesen Status pro IdP und berücksichtigt ihn, wenn eine vertrauende Seite (Relying Party, RP) über navigator.credentials.get({ identity: … }) eine FedCM-Anmeldung anfordert:

  • "logged-out": Der Browser schickt keine Anfrage an den Accounts-Endpunkt des IdP. Die Anfrage wird stumm abgelehnt, oder es erscheint ein Dialog, der zur login_url des IdP führt. So fallen unnötige Anfragen mit Cookies weg, und Tracking über Zeitmessungen wird erschwert.
  • "logged-in": Der Browser ruft die Kontenliste ab und zeigt den Kontoauswahl-Dialog an.
  • Ist kein Status bekannt, versucht der Browser den Abruf. Scheitert er, setzt der Browser den Status selbst auf "logged-out".

Rufen Sie setStatus("logged-in") direkt nach einer erfolgreichen Anmeldung beim IdP auf und setStatus("logged-out") nach dem Abmelden oder wenn die Sitzung abläuft. Statt JavaScript kann der IdP den Status auch mit dem HTTP-Antwort-Header Set-Login: logged-in bzw. Set-Login: logged-out setzen. Das eignet sich besonders für serverseitige Anmeldeabläufe.

Parameter

Name Typ Default Beschreibung
$status Pflicht "logged-in" | "logged-out" Der neue Anmeldestatus des IdP. "logged-in": Mindestens ein Nutzer ist angemeldet. "logged-out": Kein Nutzer ist angemeldet.

Rückgabewert

Typ
Promise<undefined>
Beschreibung
Ein Promise, das mit undefined erfüllt wird, sobald der Status gespeichert ist. Es wird abgelehnt (z. B. mit SecurityError), wenn der Aufruf aus einem unzulässigen Kontext kommt, etwa aus einem ursprungsfremden iframe.

Beispiele

Status nach erfolgreicher Anmeldung beim IdP setzen

// Läuft auf https://idp.example (Herkunft des Identitätsanbieters)
const loginForm = document.querySelector('#login-form');

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

  if (response.ok) {
    // Browser mitteilen: Nutzer ist jetzt beim IdP angemeldet
    if ('login' in navigator) {
      await navigator.login.setStatus('logged-in');
      console.log('FedCM-Status: logged-in');
    }
    location.href = '/konto';
  }
});
FedCM-Status: logged-in

Abmelden mit Funktionsprüfung

const logout = async () => {
  await fetch('/api/logout', { method: 'POST', credentials: 'include' });

  // Nur in Browsern mit Unterstützung der FedCM-Login-Status-API
  if (navigator.login?.setStatus) {
    try {
      await navigator.login.setStatus('logged-out');
      console.log('FedCM-Status: logged-out');
    } catch (err) {
      console.warn('Status konnte nicht gesetzt werden:', err.name);
    }
  }
};

document.querySelector('#logout').addEventListener('click', logout);
FedCM-Status: logged-out

Login-Popup nach Anmeldung schließen (mit IdentityProvider.close())

// Seite hinter der login_url des IdP, vom Browser als Popup geöffnet,
// wenn der Status "logged-out" war
const finishLogin = async () => {
  await navigator.login.setStatus('logged-in');
  // Popup schließen – der Browser setzt dann den FedCM-Ablauf beim RP fort
  IdentityProvider.close();
};

document.querySelector('#weiter').addEventListener('click', finishLogin);

Alternative: Status per HTTP-Header (Node.js/Express)

import express from 'express';
const app = express();

app.post('/api/login', (req, res) => {
  // ... Anmeldedaten prüfen, Session-Cookie setzen ...
  res.set('Set-Login', 'logged-in');
  res.json({ ok: true });
});

app.post('/api/logout', (req, res) => {
  res.set('Set-Login', 'logged-out');
  res.json({ ok: true });
});

app.listen(3000);

// Wichtig · Fallstricke

  • Experimentell und nur in Chromium verfügbar (Chrome/Edge ab Version 120). Firefox und Safari unterstützen die Methode nicht. Prüfen Sie deshalb immer vorher mit navigator.login?.setStatus.
  • Die Methode funktioniert nur in einem sicheren Kontext (HTTPS) und nur aus der IdP-Herkunft. Aus einem ursprungsfremden iframe, z. B. einem IdP-Widget auf der Seite eines RP, schlägt der Aufruf fehl.
  • Vertrauende Seiten (RPs) rufen die Methode nicht auf. Sie ist ausschließlich für den Identitätsanbieter gedacht.
  • Der Status ist nur ein Hinweis an den Browser und kein Sicherheitsmechanismus. Die eigentliche Sitzungsprüfung übernimmt weiterhin der Server über den Accounts-Endpunkt.
  • Vergessen Sie "logged-out" beim Abmelden oder beim Ablauf der Sitzung, dann ruft der Browser unnötig den Accounts-Endpunkt auf. Schlägt dieser Abruf fehl, setzt der Browser den Status zwar selbst auf "logged-out", aber der Nutzer sieht unter Umständen einen Fehlerdialog.
  • Setzen Sie den Status bei Bedarf serverseitig zusätzlich per Set-Login-Header. So bleibt er auch bei Anmeldungen ohne JavaScript korrekt, etwa bei Weiterleitungen.