FedCM-Updates: Login Status API, Error API und Auto-selected Flag API

In Chrome 120 wird die Login Status API für FedCM eingeführt. Mit der Login Status API (früher IdP Sign-in Status API) können Websites, insbesondere Identitätsanbieter, dem Browser signalisieren, wann sich ihre Nutzer anmelden und abmelden. Dieses Signal wird von FedCM verwendet, um ein Problem mit einem stillen Timing-Angriff zu beheben. So kann FedCM ohne Drittanbieter-Cookies betrieben werden. Mit dieser Aktualisierung werden die letzten verbleibenden Änderungen behoben, die wir im Rahmen unseres Arbeitsumfangs im ursprünglichen Intent to Ship von FedCM als nicht abwärtskompatibel identifiziert hatten.

Die Login Status API verbessert die Datenschutzeigenschaft und die Nutzerfreundlichkeit. Nach der Einführung ist sie jedoch nicht mehr abwärtskompatibel. Wenn Sie bereits eine FedCM-Implementierung haben, aktualisieren Sie sie anhand der folgenden Anleitung.

Außerdem gibt es in Chrome zwei neue Funktionen für die Federated Credential Management (FedCM):

  • Error API: Nutzer werden über eine native Benutzeroberfläche benachrichtigt, wenn ihr Anmeldeversuch fehlschlägt. Dabei wird die Serverantwort vom Endpunkt für die Identitätsbestätigung verwendet, sofern vorhanden.
  • Auto-Selected Flag API: Benachrichtigt den Identitätsanbieter (IdP) und die vertrauende Partei (RP), wenn im Ablauf automatisch Anmeldedaten ausgewählt wurden.

Login Status API

Die Login Status API ist ein Mechanismus, mit dem eine Website, insbesondere ein Identitätsanbieter, den Browser über den Anmeldestatus des Nutzers beim Identitätsanbieter informiert. Mit dieser API kann der Browser unnötige Anfragen an den Identitätsanbieter reduzieren und potenzielle Timing-Angriffe abwehren.

Browser über den Anmeldestatus des Nutzers informieren

Identitätsanbieter können den Anmeldestatus des Nutzers an den Browser senden, indem sie einen HTTP-Header senden oder eine JavaScript API aufrufen, wenn der Nutzer beim Identitätsanbieter angemeldet ist oder von allen seinen Identitätsanbieterkonten abgemeldet ist. Für jeden IdP (identifiziert durch seine Konfigurations-URL) speichert der Browser eine Drei-Zustands-Variable, die den Anmeldestatus mit den möglichen Werten logged-in, logged-out und unknown darstellt. Der Standardstatus ist unknown.

Um anzuzeigen, dass der Nutzer angemeldet ist, senden Sie einen Set-Login: logged-in-HTTP-Header in einer Navigation auf oberster Ebene oder in einer Anfrage für eine untergeordnete Ressource desselben Ursprungs:

Set-Login: logged-in

Alternativ können Sie die JavaScript API navigator.login.setStatus('logged-in') über den IdP-Ursprung aufrufen:

navigator.login.setStatus('logged-in');

Bei diesen Aufrufen wird der Anmeldestatus des Nutzers als logged-in aufgezeichnet. Wenn der Anmeldestatus des Nutzers auf logged-in festgelegt ist, sendet die RP, die FedCM aufruft, Anfragen an den Endpunkt der Kontoliste des Identitätsanbieters und zeigt dem Nutzer im FedCM-Dialogfeld verfügbare Konten an.

Wenn du signalisieren möchtest, dass der Nutzer von allen seinen Konten abgemeldet ist, sende den Set-Login: logged-out-HTTP-Header in einer Navigation auf oberster Ebene oder in einer Anfrage für eine untergeordnete Ressource desselben Ursprungs:

Set-Login: logged-out

Alternativ können Sie die JavaScript API navigator.login.setStatus('logged-out') vom IdP-Ursprung aus aufrufen:

navigator.login.setStatus('logged-out');

Bei diesen Aufrufen wird der Anmeldestatus des Nutzers als logged-out aufgezeichnet. Wenn der Anmeldestatus des Nutzers logged-out ist, schlägt der Aufruf der FedCM stillschweigend fehl, ohne dass eine Anfrage an den Endpunkt der Kontoliste des IdP gesendet wird.

Der unknown-Status wird festgelegt, bevor der Identitätsanbieter ein Signal über die Login Status API sendet. Wir haben diesen Status eingeführt, um die Umstellung zu erleichtern, da sich ein Nutzer möglicherweise bereits beim Identitätsanbieter angemeldet hat, wenn wir diese API veröffentlichen. Der Identitätsanbieter hat möglicherweise keine Möglichkeit, dies dem Browser zu signalisieren, bis FedCM zum ersten Mal aufgerufen wird. In diesem Fall senden wir eine Anfrage an den Endpunkt für die Kontoliste des Identitätsanbieters und aktualisieren den Status basierend auf der Antwort vom Endpunkt für die Kontoliste:

  • Wenn der Endpunkt eine Liste aktiver Konten zurückgibt, aktualisiere den Status zu logged-in und öffne das FedCM-Dialogfeld, um diese Konten anzuzeigen.
  • Wenn der Endpunkt keine Konten zurückgibt, aktualisiere den Status auf logged-out und scheitere den FedCM-Aufruf.

Was passiert, wenn die Nutzersitzung abläuft? Lassen Sie die Nutzer sich über einen dynamischen Anmeldevorgang anmelden.

Auch wenn der Identitätsanbieter den Anmeldestatus des Nutzers ständig an den Browser weitergibt, kann der Status nicht synchron sein, z. B. wenn die Sitzung abläuft. Der Browser versucht, eine Anfrage mit Anmeldedaten an den Endpunkt der Kontoliste zu senden, wenn der Anmeldestatus logged-in ist. Der Server gibt jedoch keine Konten zurück, da die Sitzung nicht mehr verfügbar ist. In einem solchen Szenario kann der Browser den Nutzer dynamisch über ein Dialogfeld beim IdP anmelden.

Im FedCM-Dialogfeld wird eine Meldung angezeigt, in der eine Anmeldung vorgeschlagen wird (siehe Abbildung unten).

Ein FedCM-Dialogfeld, in dem zur Anmeldung beim IdP aufgefordert wird.
Ein FedCM-Dialogfeld, in dem zur Anmeldung beim IdP aufgefordert wird.

Wenn der Nutzer auf die Schaltfläche Weiter klickt, öffnet der Browser ein Dialogfeld für die Anmeldeseite des Identitätsanbieters.

Beispiel für einen Dialog
Beispiel für ein Dialogfeld, das nach dem Klicken auf die Schaltfläche „Über den Identitätsanbieter anmelden“ angezeigt wird.

Die URL der Anmeldeseite wird in der IdP-Konfigurationsdatei mit login_url angegeben.

{
  "accounts_endpoint": "/auth/accounts",
  "client_metadata_endpoint": "/auth/metadata",
  "id_assertion_endpoint": "/auth/idtokens",
  "login_url": "/login"
  }
}

Das Dialogfeld ist ein normales Browserfenster mit eigenen Cookies. Was im Dialogfeld passiert, liegt im Ermessen des Identitätsanbieters. Es sind keine Fenster-Handles verfügbar, um eine plattformübergreifende Kommunikationsanfrage an die RP-Seite zu senden. Nachdem sich der Nutzer angemeldet hat, sollte der Identitätsanbieter Folgendes tun:

  • Sende den Set-Login: logged-in-Header oder rufe die navigator.login.setStatus("logged-in") API auf, um den Browser darüber zu informieren, dass der Nutzer angemeldet ist.
  • Drücken Sie IdentityProvider.close(), um das Dialogfeld zu schließen.
Ein Nutzer meldet sich bei einem RP an, nachdem er sich mit FedCM beim IdP angemeldet hat.
Ein Nutzer meldet sich bei einem RP an, nachdem er sich mit FedCM beim IdP angemeldet hat.

Sie können das Verhalten der Login Status API in unserer Demo ausprobieren.

  1. Tippen Sie auf die Schaltfläche Zum Identitätsanbieter gehen und anmelden.
  2. Melden Sie sich mit einem beliebigen Konto an.
  3. Wähle im Drop-down-Menü Kontostatus die Option Sitzung abgelaufen aus.
  4. Drücke auf die Schaltfläche Persönliche Daten aktualisieren.
  5. Tippen Sie auf die Schaltfläche RP aufrufen, um FedCM zu testen.

Sie sollten die Anmeldung beim Identitätsanbieter über das Modulverhalten beobachten können.

Error API

Wenn Chrome eine Anfrage an den Endpunkt für die ID-Bestätigung sendet (z. B. wenn ein Nutzer auf die Schaltfläche Weiter als in der FedCM-Benutzeroberfläche klickt oder die automatische erneute Authentifizierung ausgelöst wird), kann der Identitätsanbieter aus legitimen Gründen möglicherweise kein Token ausstellen. Beispielsweise, wenn der Client nicht autorisiert ist oder der Server vorübergehend nicht verfügbar ist. Derzeit lehnt Chrome die Anfrage bei solchen Fehlern stillschweigend ab und benachrichtigt den RP nur, indem das Promise abgelehnt wird.

Mit der Error API benachrichtigt Chrome den Nutzer, indem eine native Benutzeroberfläche mit den vom IdP bereitgestellten Fehlerinformationen angezeigt wird.

Ein FedCM-Dialogfeld mit der Fehlermeldung nach dem fehlgeschlagenen Anmeldeversuch des Nutzers. Der String ist mit dem Fehlertyp verknüpft.
Ein FedCM-Dialogfeld mit der Fehlermeldung nach dem fehlgeschlagenen Anmeldeversuch des Nutzers. Der String ist mit dem Fehlertyp verknüpft.

IdP HTTP API

In der id_assertion_endpoint-Antwort kann der Identitätsanbieter ein Token an den Browser zurückgeben, wenn es auf Anfrage ausgestellt werden kann. In diesem Vorschlag kann der IdP im Fall, dass ein Token nicht ausgestellt werden kann, eine „error“-Antwort mit zwei neuen optionalen Feldern zurückgeben:

  1. code
  2. url
// id_assertion_endpoint response
{
  "error": {
     "code": "access_denied",
     "url": "https://idp.example/error?type=access_denied"
  }
}

Als Code kann der IdP einen der bekannten Fehler aus der in OAuth 2.0 angegebenen Fehlerliste [invalid_request, unauthorized_client, access_denied, server_error und temporarily_unavailable] auswählen oder einen beliebigen String verwenden. In diesem Fall rendert Chrome die Fehler-UI mit einer generischen Fehlermeldung und übergibt den Code an den RP.

Für url wird eine visuell lesbare Webseite mit Informationen zum Fehler angegeben, um Nutzern zusätzliche Informationen zum Fehler zur Verfügung zu stellen. Dieses Feld ist für Nutzer nützlich, da Browser keine umfassenden Fehlermeldungen in einer nativen Benutzeroberfläche anzeigen können. Beispielsweise Links zu den nächsten Schritten oder Kontaktdaten des Kundenservice. Wenn ein Nutzer mehr über die Fehlerdetails und deren Behebung erfahren möchte, kann er die bereitgestellte Seite über die Browser-Benutzeroberfläche aufrufen. Die URL muss sich auf derselben Website wie der Identitätsanbieter configURL befinden.

try {
  const cred = await navigator.credentials.get({
    identity: {
      providers: [
        {
          configURL: 'https://idp.example/manifest.json',
          clientId: '1234',
        },
      ],
    }
  });
} catch (e) {
  const code = e.code;
  const url = e.url;
}

Auto-Selected Flag API

mediation: optional ist das Standardverhalten für die Nutzervermittlung in der Credential Management API und löst nach Möglichkeit eine automatische erneute Authentifizierung aus. Die automatische erneute Authentifizierung ist jedoch möglicherweise aus Gründen, die nur dem Browser bekannt sind, nicht verfügbar. In diesem Fall wird der Nutzer möglicherweise aufgefordert, sich mit expliziter Nutzervermittlung anzumelden. Dieser Ablauf hat andere Eigenschaften.

  • Wenn ein API-Caller ein ID-Token erhält, kann er nicht erkennen, ob es sich um das Ergebnis eines automatischen Reauthentifizierungsvorgangs handelt. Das erschwert es ihnen, die API-Leistung zu bewerten und die UX entsprechend zu verbessern.
  • Aus Sicht des Identitätsanbieters kann dieser nicht feststellen, ob eine automatische erneute Authentifizierung für die Leistungsbewertung stattgefunden hat. Außerdem kann die Angabe, ob eine explizite Nutzervermittlung beteiligt war, dabei helfen, mehr sicherheitsrelevante Funktionen zu unterstützen. Einige Nutzer bevorzugen beispielsweise eine höhere Sicherheitsstufe, bei der die Authentifizierung explizit vom Nutzer verwaltet werden muss. Wenn ein Identitätsanbieter eine Tokenanfrage ohne diese Vermittlung erhält, kann er die Anfrage anders verarbeiten. Gib beispielsweise einen Fehlercode zurück, damit der RP die FedCM API noch einmal mit mediation: required aufrufen kann.

Daher wäre es für Entwickler von Vorteil, den Ablauf der automatischen erneuten Authentifizierung sehen zu können.

Über die Auto-selected Flag API teilt Chrome sowohl dem IdP als auch dem RP mit, ob eine explizite Nutzerberechtigung durch Tippen auf die Schaltfläche Als erlangt wurde, wenn eine automatische Reauthentifizierung oder eine explizite Vermittlung stattgefunden hat. Die Freigabe erfolgt erst, nachdem die Nutzerberechtigung für die IdP/RP-Kommunikation erteilt wurde.

IdP-Freigabe

Damit die Informationen nach der Nutzerberechtigung an den IdP weitergegeben werden, fügt Chrome is_auto_selected=true in die POST-Anfrage ein, die an die id_assertion_endpoint gesendet wird:

POST /fedcm_assertion_endpoint HTTP/1.1
Host: idp.example
Origin: https://rp.example/
Content-Type: application/x-www-form-urlencoded
Cookie: 0x23223
Sec-Fetch-Dest: webidentity

account_id=123&client_id=client1234&nonce=Ct0D&disclosure_text_shown=true&is_auto_selected=true

RP-Freigabe

Der Browser kann die Informationen über IdentityCredential an den RP in isAutoSelected weitergeben:

const cred = await navigator.credentials.get({
  identity: {
    providers: [{
      configURL: 'https://idp.example/manifest.json',
      clientId: '1234'
    }]
  }
});

if (cred.isAutoSelected !== undefined) {
  const isAutoSelected = cred.isAutoSelected;
}

Feedback geben und erhalten

Wenn Sie Feedback haben oder während des Tests Probleme auftreten, können Sie sich unter crbug.com melden.

Foto von Girl with red hat auf Unsplash