Aktualizacje FedCM: interfejs Login Status API, Error API oraz automatycznie wybrany interfejs Flag API

Chrome 120 udostępnia interfejs Login Status API do FedCM. Interfejs API stanu logowania (dawniej interfejs API stanu logowania dostawcy tożsamości) umożliwia witrynom, w szczególności dostawcom tożsamości, sygnalizowanie przeglądarce, kiedy użytkownicy się logują i wylogowują. Ten sygnał jest używany przez FedCM do rozwiązywania problemu związanego z cichym atakiem opartym na synchronizacji. Pozwala to FedCM działać bez plików cookie innych firm. Ta aktualizacja rozwiązuje problemy związane z ostatnimi zmianami, które nie są zgodne z wcześniejszymi wersjami. Zmiany te zostały wcześniej zidentyfikowane w pierwotnym zamiarze wprowadzenia FedCM w ramach zakresu prac.

Interfejs API stanu logowania poprawia prywatność i użyteczność, ale po wprowadzeniu jest niekompatybilny ze starszymi wersjami. Jeśli masz już wdrożone FedCM, zaktualizuj je, korzystając z tych instrukcji.

Chrome udostępnia też 2 nowe funkcje federowanego zarządzania danymi uwierzytelniania (FedCM):

  • Błąd interfejsu API: powiadomienie użytkowników o nieudanym logowaniu za pomocą natywnego interfejsu użytkownika na podstawie odpowiedzi serwera z punktu końcowego identyfikacji tożsamości (jeśli występuje).
  • Auto-Selected Flag API: powiadomienie dostawcy tożsamości (IdP) i strony trzeciej (RP), że dane logowania zostały automatycznie wybrane w ramach procesu.

Login Status API

Interfejs API stanu logowania to mechanizm, w którym witryna, zwłaszcza dostawca tożsamości, informuje przeglądarkę o stanie logowania użytkownika w dostawcy tożsamości. Dzięki temu interfejsowi API przeglądarka może ograniczyć liczbę niepotrzebnych żądań do dostawcy tożsamości i zmniejszyć ryzyko potencjalnych ataków związanych z czasem.

Informowanie przeglądarki o stanie logowania użytkownika

Dostawcy tożsamości mogą sygnalizować stan logowania użytkownika w przeglądarce, wysyłając nagłówek HTTP lub wywołując interfejs JavaScript API, gdy użytkownik jest zalogowany w dostawcy tożsamości lub gdy jest wylogowany ze wszystkich kont dostawcy tożsamości. W przypadku każdego dostawcy tożsamości (identyfikowanego za pomocą adresu URL konfiguracji) przeglądarka przechowuje zmienną o 3 stanach, która reprezentuje stan logowania. Możliwe wartości to logged-in, logged-outunknown. Stan domyślny to unknown.

Aby zasygnalizować, że użytkownik jest zalogowany, wyślij nagłówek HTTP Set-Login: logged-in w nawigacji najwyższego poziomu lub żądaniu zasobu podrzędnego z tego samego pochodzenia:

Set-Login: logged-in

Możesz też wywołać interfejs JavaScript API navigator.login.setStatus('logged-in')z źródła dostawcy tożsamości:

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

Te wywołania rejestrują stan logowania użytkownika jako logged-in. Gdy stan logowania użytkownika jest ustawiony na logged-in, RP wywołujący FedCM wysyła żądania do punktu końcowego listy kont dostawcy tożsamości i wyświetla dostępne konta w oknie dialogowym FedCM.

Aby zasygnalizować, że użytkownik jest wylogowany ze wszystkich kont, wyślij nagłówek HTTP Set-Login: logged-out w ramach nawigacji najwyższego poziomu lub żądania zasobu podrzędnego z tego samego pochodzenia:

Set-Login: logged-out

Możesz też wywołać interfejs JavaScript API navigator.login.setStatus('logged-out') z początku dostawcy tożsamości:

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

Te wywołania rejestrują stan logowania użytkownika jako logged-out. Gdy stan logowania użytkownika to logged-out, wywołanie interfejsu FedCM kończy się niepowodzeniem bez wysyłania żądania do punktu końcowego listy kont dostawcy tożsamości.

Stan unknown jest ustawiany, zanim dostawca tożsamości wyśle sygnał za pomocą interfejsu LoginStatus API. Wprowadziliśmy ten stan, aby ułatwić przejście, ponieważ użytkownik może być już zalogowany w dostawcy tożsamości w momencie udostępnienia tego interfejsu API. Dostawca tożsamości może nie mieć możliwości zasygnalizowania tego przeglądarce w momencie pierwszego wywołania FedCM. W tym przypadku wysyłamy żądanie do punktu końcowego listy kont dostawcy tożsamości i aktualizujemy stan na podstawie odpowiedzi z punktu końcowego listy kont:

  • Jeśli punkt końcowy zwróci listę aktywnych kont, zmień stan na logged-in i otwórz okno FedCM, aby wyświetlić te konta.
  • Jeśli punkt końcowy nie zwróci żadnych kont, zaktualizuj stan na logged-out i zakończ wywołanie interfejsu FedCM.

Co się stanie, jeśli sesja użytkownika wygaśnie? Pozwól użytkownikowi zalogować się za pomocą dynamicznego procesu logowania.

Mimo że dostawca tożsamości przekazuje przeglądarce stan logowania użytkownika, stan ten może być niezsynchronizowany, np. gdy sesja wygasa. Gdy stan logowania to logged-in, przeglądarka próbuje wysłać żądanie z danymi logowania do punktu końcowego listy kont, ale serwer nie zwraca żadnych kont, ponieważ sesja nie jest już dostępna. W takim przypadku przeglądarka może dynamicznie umożliwić użytkownikowi zalogowanie się w usłudze dostawcy tożsamości za pomocą okna dialogowego.

W oknie FedCM wyświetla się komunikat z prośbą o zalogowanie, jak pokazano na poniższym obrazku.

Okno FedCM sugerujące zalogowanie się w usługach dostawcy tożsamości.
Okno logowania sfederowanego sugerujące zalogowanie się w dostawcy tożsamości.

Gdy użytkownik kliknie przycisk Dalej, przeglądarka otworzy okno logowania dostawcy usług zaufania.

Przykładowy dialog
Przykład okna wyświetlanego po kliknięciu przycisku logowania w dostawcy tożsamości

Adres URL strony logowania jest określony za pomocą login_url w ramach pliku konfiguracyjnego dostawcy tożsamości.

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

To zwykłe okno przeglądarki z własnymi plikami cookie. To, co dzieje się w ramach okna dialogowego, zależy od dostawcy tożsamości. Nie ma żadnych uchwytów okna, które umożliwiałyby wysyłanie żądań komunikacji między domenami na stronie strony zależnej. Gdy użytkownik się zaloguje, dostawca tożsamości powinien:

  • Prześlij nagłówek Set-Login: logged-in lub wywołaj interfejs API navigator.login.setStatus("logged-in"), aby poinformować przeglądarkę, że użytkownik zalogował się.
  • Aby zamknąć okno, zadzwoń pod numer IdentityProvider.close().
Użytkownik loguje się w usłudze RP po zalogowaniu się w usłudze dostawcy tożsamości za pomocą FedCM.
Użytkownik loguje się w usłudze RP po zalogowaniu się w usłudze dostawcy tożsamości za pomocą FedCM.

Aby wypróbować działanie interfejsu Login Status API, skorzystaj z naszego demo.

  1. Kliknij przycisk Przejdź do dostawcy tożsamości i zaloguj się.
  2. Zaloguj się na dowolne konto.
  3. W menu Stan konta wybierz Sesja wygasła.
  4. Kliknij przycisk Zaktualizuj dane osobowe.
  5. Kliknij przycisk Otwórz stronę RP, aby wypróbować FedCM.

Za pomocą zachowania modułu możesz obserwować logowanie do dostawcy tożsamości.

Interfejs API błędów

Gdy Chrome wysyła żądanie do punktu końcowego oświadczenia o tożsamości (np. gdy użytkownik kliknie przycisk Dalej jako w interfejsie FedCM lub zostanie uruchomione automatyczne ponowne uwierzytelnianie), dostawca tożsamości może nie być w stanie wydać tokenu z uzasadnionych powodów. Na przykład jeśli klient nie ma uprawnień, serwer jest tymczasowo niedostępny itp. Obecnie w przypadku takich błędów Chrome nie odpowiada na żądanie, a tylko informuje RP o odrzuceniu obietnicy.

Dzięki interfejsowi Error API przeglądarka Chrome powiadamia użytkownika, wyświetlając natywny interfejs użytkownika z informacjami o błędzie dostarczonymi przez dostawcę tożsamości.

Okno FedCM z komunikatem o błędzie po nieudanej próbie zalogowania użytkownika. Ciąg jest powiązany z typem błędu.
Okno FedCM z komunikatem o błędzie po nieudanej próbie zalogowania użytkownika. Ten ciąg jest powiązany z typem błędu.

IdP HTTP API

W odpowiedzi id_assertion_endpoint dostawca tożsamości może zwrócić token do przeglądarki, jeśli może go wydać na żądanie. W ramach tej propozycji, jeśli nie można wydać tokena, dostawca tożsamości może zwrócić odpowiedź „error” (błąd), która zawiera 2 nowe pola opcjonalne:

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

W przypadku kodu dostawca tożsamości może wybrać jeden z znanych błędów z listy błędów określonych w protokole OAuth 2.0 [invalid_request, unauthorized_client, access_denied, server_errortemporarily_unavailable] lub użyć dowolnego ciągu znaków. W takim przypadku Chrome renderuje interfejs błędu z ogólnym komunikatem o błędzie i przekazuje kod do RP.

W przypadku url identyfikuje stronę internetową z informacjami o błędzie, aby zapewnić użytkownikom dodatkowe informacje. To pole jest przydatne dla użytkowników, ponieważ przeglądarki nie mogą wyświetlać rozbudowanych komunikatów o błędach w natywnym interfejsie użytkownika. Może to być na przykład link do dalszych czynności lub informacje kontaktowe obsługi klienta. Jeśli użytkownik chce dowiedzieć się więcej o błędzie i sposobach jego naprawienia, może otworzyć odpowiednią stronę w interfejsie przeglądarki. Adres URL musi należeć do tej samej witryny co dostawca tożsamości configURL.

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;
}

Interfejs API flagi wybranej automatycznie

mediation: optional to domyślne zachowanie pośredniczenia użytkownika w interfejsie Credential Management API, które powoduje automatyczne ponowne uwierzytelnianie, gdy jest to możliwe. Automatyczne ponowne uwierzytelnianie może jednak być niedostępne z powodu, który zna tylko przeglądarka. Gdy jest niedostępne, użytkownik może zostać poproszony o logowanie z wyraźną mediacją użytkownika, która jest procesem z różnymi właściwościami.

  • Z perspektywy wywołującego interfejs API, gdy otrzyma on token ID, nie ma informacji o tym, czy jest to wynik automatycznego procesu ponownej uwierzytelniania. W związku z tym trudno im ocenić skuteczność interfejsu API i odpowiednio poprawić UX.
  • Z punktu widzenia dostawcy tożsamości nie jest on również w stanie określić, czy automatyczna ponowna autoryzacja miała miejsce, czy nie, na potrzeby oceny skuteczności. Dodatkowo, czy w przypadku danego użytkownika włączone było pośrednictwo, może pomóc w utrzymywaniu większej liczby funkcji związanych z bezpieczeństwem. Niektórzy użytkownicy mogą na przykład preferować wyższy poziom zabezpieczeń, który wymaga uwierzytelniania z wyraźną akceptacją użytkownika. Jeśli dostawca tożsamości otrzyma prośbę o token bez takiego pośrednictwa, może obsłużyć ją inaczej. Na przykład zwracanie kodu błędu, aby RP mógł ponownie wywołać interfejs FedCM API z parametrem mediation: required.

Dlatego warto udostępnić widoczność procesu automatycznego ponownego uwierzytelniania, aby ułatwić pracę deweloperom.

Dzięki interfejsowi API automatycznie wybranego flagi Chrome udostępnia informacje o tym, czy użytkownik udzielił wyraźnej zgody, klikając przycisk Dalej jako zarówno w usłudze IdP, jak i w usłudze RP, gdy nastąpiła automatyczna ponowna autoryzacja lub wyraźne pośredniczenie. Udostępnianie następuje dopiero po udzieleniu przez użytkownika zgody na komunikację z IDP/RP.

Udostępnianie dostawcy tożsamości

Aby udostępnić informacje dostawcy tożsamości po uzyskaniu zgody użytkownika, Chrome dołącza is_auto_selected=true do POST żądania wysyłanego do id_assertion_endpoint:

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

Udostępnianie stron objętych ograniczeniami

Przeglądarka może udostępniać informacje RP w ramach isAutoSelected za pomocą:IdentityCredential

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

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

Zaangażowanie i przesyłanie opinii

Jeśli masz uwagi lub napotkasz problemy podczas testowania, możesz je zgłosić na stronie crbug.com.

Zdjęcie autorstwa Girl z czerwonym kapeluszem na Unsplash