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.
Gdy użytkownik kliknie przycisk Dalej, w przeglądarce otworzy się okno ze stroną logowania 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 APInavigator.login.setStatus("logged-in")
, aby poinformować przeglądarkę o zalogowaniu użytkownika. - Wywołaj
IdentityProvider.close()
, aby zamknąć okno.
Możesz wypróbować działanie interfejsu Login Status API w naszej prezentacji.
- Kliknij przycisk Otwórz stronę dostawcy tożsamości i zaloguj się.
- logować się na dowolne konto.
- Wybierz Sesja wygasła z menu Stan konta.
- Kliknij przycisk Zaktualizuj dane osobowe.
- 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.
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:
code
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