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

Chrome 120 wysyła interfejs Login Status API dla FedCM. Interfejs Login Status API (wcześniej znany jako Id Sign-in Status API) umożliwia witrynom, a zwłaszcza dostawcom tożsamości, informowanie przeglądarki o tym, że użytkownicy się logują i się wylogują. FedCM wykorzystuje ten sygnał do rozwiązywania problemu z cichym atakowaniem czasowym. Dzięki temu FedCM może działać bez plików cookie innych firm. Ta aktualizacja rozwiązuje ostatnie pozostałe niezgodne wstecznie zmiany, które zidentyfikowaliśmy wcześniej w pierwotnej intencji wysyłki FedCM w ramach naszych zakresów.

Interfejs Login Status API poprawia ochronę prywatności i łatwość obsługi, ale po jego wprowadzeniu jest niekompatybilna wstecznie. Jeśli masz już implementację FedCM, zaktualizuj ją, postępując zgodnie z instrukcjami poniżej.

Dodatkowo Chrome udostępnia 2 nowe funkcje Federated Credential Management (FedCM):

  • Error API: powiadamia użytkowników, gdy ich próba logowania się nie powiedzie, przy użyciu natywnego interfejsu użytkownika opartego na odpowiedzi serwera z punktu końcowego potwierdzenia identyfikatora (jeśli istnieje).
  • Auto-Selected Flag API: powiadamia dostawcę tożsamości i stronę uzależnioną, jeśli dane logowania zostały wybrane automatycznie podczas procesu.

Interfejs Login Status API

Interfejs Login Status API to mechanizm, dzięki któremu witryna, zwłaszcza dostawca tożsamości, informuje przeglądarkę o stanie logowania użytkownika w systemie dostawcy tożsamości. Ten interfejs API może ograniczać liczbę zbędnych żądań wysyłanych do dostawcy tożsamości i ograniczać potencjalne ataki czasowe.

Przekazywanie do przeglądarki informacji o stanie logowania użytkownika

Dostawcy tożsamości mogą zasygnalizować przeglądarce stan logowania użytkownika, wysyłając nagłówek HTTP lub wywołując interfejs JavaScript API, gdy użytkownik jest zalogowany w tym dostawcy lub gdy użytkownik jest wylogowany ze wszystkich swoich kont dostawcy tożsamości. W przypadku każdego dostawcy tożsamości (identyfikowanego na podstawie adresu URL konfiguracji) przeglądarka przechowuje zmienną trójstanową reprezentującą stan logowania z możliwymi wartościami logged-in, logged-out i unknown. 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 w żądaniu zasobu podrzędnego tego samego źródła:

Set-Login: logged-in

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

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

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

Aby zasygnalizować, że użytkownik jest wylogowany ze wszystkich swoich kont, wyślij nagłówek HTTP Set-Login: logged-out w panelu nawigacyjnym najwyższego poziomu lub w żądaniu zasobu podrzędnego tego samego źródła:

Set-Login: logged-out

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

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

Te połączenia rejestrują stan logowania użytkownika jako logged-out. Gdy stan logowania użytkownika to logged-out, wywoływanie FedCM w sposób dyskretny 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 Login Status API. Wprowadziliśmy ten stan, aby ułatwić przejście, ponieważ użytkownik mógł już zalogować się u dostawcy tożsamości, gdy wysyłaliśmy ten interfejs API. Dostawca tożsamości może nie być w stanie zasygnalizować tej przeglądarce, zanim nastąpi pierwsze wywołanie FedCM. W takim przypadku wysyłamy żądanie do punktu końcowego listy kont dostawcy tożsamości i aktualizujemy stan na podstawie odpowiedzi punktu końcowego listy kont:

  • Jeśli punkt końcowy zwraca listę aktywnych kont, zmień stan na logged-in i otwórz okno FedCM, aby je wyświetlić.
  • Jeśli punkt końcowy nie zwraca żadnych kont, zaktualizuj stan na logged-out i nie powiedzie się wywołania FedCM.

Co się stanie, gdy sesja użytkownika wygaśnie? Pozwól użytkownikowi logować się w ramach dynamicznego procesu logowania.

Dostawca tożsamości informuje przeglądarkę o stanie logowania użytkownika, ale ten stan może być niezsynchronizowany, na przykład gdy sesja wygaśnie. Gdy stan logowania wynosi logged-in, przeglądarka próbuje wysłać żądanie z danymi uwierzytelniającymi do punktu końcowego listy kont, ale serwer nie zwraca żadnych kont, ponieważ sesja nie jest już dostępna. W takiej sytuacji przeglądarka może dynamicznie zezwolić użytkownikowi na zalogowanie się w dostawcy tożsamości w oknie dialogowym.

W oknie FedCM wyświetlany jest komunikat sugerujący zalogowanie, tak jak na ilustracji poniżej.

Okno FedCM z prośbą o zalogowanie się w dostawcy tożsamości.
Okno FedCM z prośbą o zalogowanie się w dostawcy tożsamości.

Gdy użytkownik kliknie przycisk Dalej, w przeglądarce otworzy się okno ze stroną logowania dostawcy tożsamości.

Przykładowe okno dialogowe.
Przykładowe okno wyświetlane po kliknięciu przycisku Zaloguj się do dostawcy tożsamości.

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

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

Jest to zwykłe okno przeglądarki, które zawiera własne pliki cookie. Decyzja o tym, co się stanie w oknie, zależy od dostawcy tożsamości. Nie są dostępne żadne uchwyty okien, które mogłyby wysłać żądanie komunikacji między domenami do strony RP. Gdy użytkownik się zaloguje, dostawca tożsamości powinien:

  • Wyślij nagłówek Set-Login: logged-in lub wywołaj interfejs API navigator.login.setStatus("logged-in"), aby poinformować przeglądarkę o zalogowaniu użytkownika.
  • Wywołaj IdentityProvider.close(), aby zamknąć okno.
Użytkownik loguje się w grupie objętej ograniczeniami po zalogowaniu się u dostawcy tożsamości przy użyciu FedCM.
Użytkownik loguje się w grupie objętej ograniczeniami po zalogowaniu się u dostawcy tożsamości przy użyciu FedCM.

Możesz wypróbować działanie interfejsu Login Status API w naszej prezentacji.

  1. Kliknij przycisk Otwórz stronę dostawcy tożsamości i zaloguj się.
  2. logować się na dowolne konto.
  3. Wybierz Sesja wygasła z menu Stan konta.
  4. Kliknij przycisk Zaktualizuj dane osobowe.
  5. Kliknij przycisk Odwiedź grupę objętą ograniczeniami, aby wypróbować FedCM.

Działanie modułu powinno być możliwe do obserwowania logowania u dostawcy tożsamości.

Error API

Gdy Chrome wysyła żądanie do punktu końcowego potwierdzenia identyfikatora (np. gdy użytkownik kliknie przycisk Kontynuuj jako w interfejsie FedCM lub uruchomi automatyczne ponowne uwierzytelnianie), dostawca tożsamości może nie być w stanie wystawić tokena z uzasadnionych powodów. Jeśli na przykład klient jest nieautoryzowany, serwer jest tymczasowo niedostępny. Obecnie w przypadku takich błędów Chrome nie wysyła żądania dyskretnie, a jedynie powiadamia grupę objętą ograniczeniami, odrzucając obietnicę.

Za pomocą interfejsu Error API Chrome powiadamia użytkownika, wyświetlając natywny interfejs z informacjami o błędzie podanymi przez dostawcę tożsamości.

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

Interfejs API HTTP dostawcy tożsamości

W odpowiedzi id_assertion_endpoint dostawca tożsamości może zwrócić do przeglądarki token, jeśli może on zostać wydany na żądanie. Jeśli w tej ofercie nie będzie można wystawić tokena, dostawca tożsamości może zwrócić odpowiedź „error” z 2 nowymi opcjonalnymi polami:

  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 ze znanych błędów z listy błędów OAuth 2.0 [invalid_request, unauthorized_client, access_denied, server_error i temporarily_unavailable] lub użyć dowolnego ciągu znaków. W tym drugim przypadku Chrome renderuje interfejs błędu z ogólnym komunikatem o błędzie i przekazuje kod do grupy objętej ograniczeniami.

W przypadku url wskazuje stronę internetową z informacjami o błędzie zrozumiałą dla człowieka, aby udostępnić użytkownikom dodatkowe informacje o błędzie. To pole jest przydatne dla użytkowników, ponieważ przeglądarki nie dostarczają szczegółowych komunikatów o błędach w natywnym interfejsie użytkownika. Mogą to być na przykład linki do kolejnych kroków, informacje kontaktowe działu obsługi klienta itd. Jeśli użytkownik chce dowiedzieć się więcej o błędzie i sposobie jego naprawienia, może wejść na podaną stronę z interfejsu przeglądarki, by dowiedzieć się więcej. Adres URL musi wskazywać tę samą witrynę 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;
}

Automatycznie wybrany interfejs API flag

mediation: optional to domyślne działanie zapośredniczenia użytkownika w interfejsie Credential Management API. Powoduje ono automatyczne ponowne uwierzytelnianie, gdy to możliwe. Jednak automatyczne ponowne uwierzytelnianie może być niedostępne z powodów, o których wie tylko przeglądarka. Gdy jest niedostępne, użytkownik może zostać poproszony o zalogowanie się za pomocą jawnego zapośredniczenia, które obejmuje różne właściwości.

  • Element wywołujący interfejs API po otrzymaniu tokena identyfikatora nie ma wglądu w to, czy był on wynikiem procesu automatycznego ponownego uwierzytelniania. Utrudnia to ocenę działania interfejsu API i odpowiednie ulepszanie wygody użytkowników.
  • Z perspektywy dostawcy tożsamości nie są też w stanie określić na potrzeby oceny skuteczności, czy doszło do automatycznego ponownego uwierzytelnienia. Wyraźne zapośredniczenie użytkowników może też pomóc w obsłudze dodatkowych funkcji związanych z bezpieczeństwem. Na przykład niektórzy użytkownicy mogą preferować wyższy poziom zabezpieczeń, który wymaga bezpośredniego zapośredniczenia podczas uwierzytelniania. Jeśli dostawca tożsamości otrzyma żądanie tokena bez takiego zapośredniczenia, może obsłużyć to żądanie inaczej. Może to być na przykład zwracanie kodu błędu, tak by grupa RP mogła ponownie wywołać interfejs FedCM API za pomocą mediation: required.

Dlatego udostępnienie procesu automatycznego ponownego uwierzytelniania może być korzystne dla deweloperów.

Dzięki automatycznie wybranemu interfejsowi Flag API Chrome informuje o tym, czy użytkownik uzyskał jednoznaczną zgodę użytkownika, klikając przycisk Kontynuuj jako u dostawcy tożsamości i grupy objętej ograniczeniami, gdy doszło do automatycznego ponownego uwierzytelnienia lub nastąpiło jawne zapośredniczenie. Udostępnianie odbywa się dopiero po przyznaniu użytkownikowi uprawnień do komunikacji dostawcy tożsamości/RP.

Udostępnianie dostawcy tożsamości

Aby udostępnić te informacje dostawcy tożsamości na podstawie zgody użytkownika, Chrome uwzględnia is_auto_selected=true w żądaniu POST wysyłanym 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 w grupie objętej ograniczeniami

Przeglądarka może udostępnić informacje grupie objętej ograniczeniami w 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;
}

Angażuj i dziel się opiniami

Jeśli podczas testowania chcesz podzielić się z nami opiniami lub napotkać problemy, możesz podzielić się nimi na stronie crbug.com.

Autor zdjęcia: Girl with Red hat (Dziewczyna w czerwonym kapeluszu) na kanale Unsplash