Szczegółowe informacje dotyczące weryfikacji użytkowników

Ten dokument zawiera informacje o tym, co zawiera userVerification w WebAuthn, oraz o zachowaniach przeglądarki, które występują, gdy podczas tworzenia lub uwierzytelniania klucza dostępu określono userVerification.

Co to jest „weryfikacja użytkownika” w WebAuthn?

Klucze dostępu są oparte na kryptografii klucza publicznego. W ten sposób generowana jest para kluczy publiczny-prywatny, klucz prywatny jest przechowywany przez dostawcę klucza dostępu, a klucz publiczny jest zwracany do serwera podmiotu uzależniającego (RP) w celu ich zapisania. Serwer może uwierzytelnić użytkownika, weryfikując podpis podpisany tym samym kluczem dostępu przy użyciu sparowanego klucza publicznego. Flaga „użytkownik obecny” (UP) na danych logowania klucza publicznego świadczy o tym, że ktoś korzystał z urządzenia podczas uwierzytelniania.

Weryfikacja użytkownika to opcjonalna warstwa zabezpieczeń, która ma potwierdzić, że w trakcie uwierzytelniania widoczna była właściwa osoba, a nie tylko osoba, co twierdzi na ekranie użytkownika. Na smartfonach zwykle wykorzystuje się do tego mechanizm blokady ekranu. Jest to biometryczny kod PIN lub hasło. To, czy przeprowadzono weryfikację użytkownika, jest zgłaszane za pomocą flagi „UV”, która jest zwracana w danych uwierzytelniających podczas rejestracji i uwierzytelniania klucza dostępu.

Zrzut ekranu z oknem weryfikacji użytkownika w pęku kluczy iCloud w systemie macOS. W oknie dialogowym wyświetla się prośba o zalogowanie się przy użyciu Touch ID. Wyświetlane są informacje o źródle wysyłającym żądanie uwierzytelnienia oraz nazwa użytkownika. W prawym górnym rogu okna znajduje się przycisk „Anuluj”.
Okno weryfikacji użytkownika w pęku kluczy iCloud w systemie macOS.
Zrzut ekranu z oknem weryfikacji użytkownika w Chrome na Androida W oknie pojawi się prośba o potwierdzenie tożsamości za pomocą rozpoznawania twarzy lub odcisku palca. Wyświetli się też strona, z której pochodzi prośba o uwierzytelnienie. W lewym dolnym rogu znajdziesz opcję weryfikacji za pomocą kodu PIN.
Okno weryfikacji użytkownika w Chrome na Androida.

Jak weryfikowana jest weryfikacja UP i UV na serwerze

Flagi wartości logicznej obecności (UP) i zweryfikowania przez użytkownika (UV) są sygnalizowane do serwera w polu danych uwierzytelniania. Podczas uwierzytelniania zawartość pola danych uwierzytelniających można zweryfikować, weryfikując podpis przy użyciu zapisanego klucza publicznego. Dopóki podpis jest prawidłowy, serwer może uznawać flagi za autentyczne.

Ilustracja przedstawiająca strukturę danych dotyczących uwierzytelniania. Od lewej do prawej sekcja struktury danych ma postać „RP ID HASH” (32 bajty), „FLAGS” (1 bajt), „COUNTER” (4 bajty, big-endian uint32) i „ATTESTE CRED”. DATA” (zmienna długość, jeśli występuje) i „EXTENSIONS” (zmienna długość, jeśli występuje (CBOR)). Sekcja „FLAGS” jest rozwinięta i wyświetla listę potencjalnych flag oznaczonych od lewej do prawej: „ED”, „AT”, „0”, „BS”, „BE”, „UV”, „0” i „UP”.
Pola danych z aplikacji Authenticator w danych logowania klucza publicznego.

Podczas rejestrowania i uwierzytelniania klucza dostępu serwer powinien sprawdzić, czy flaga UP to true i czy w zależności od wymagań jest to true lub false.

Określanie parametru userVerification

Zgodnie ze specyfikacją WebAuthn organizacja RP może zażądać weryfikacji użytkownika za pomocą parametru userVerification zarówno podczas tworzenia, jak i potwierdzania danych logowania. Akceptuje atrybuty 'preferred', 'required' i 'discouraged', co oznacza, że:

  • 'preferred' (ustawienie domyślne): korzystanie z metody weryfikacji użytkownika na urządzeniu jest preferowane, ale można ją pominąć, jeśli nie jest dostępna. Dane uwierzytelniające odpowiedzi zawierają wartość flagi UV równą true, jeśli weryfikacja użytkownika została przeprowadzona, lub false, jeśli nie przeprowadzono weryfikacji UV.
  • 'required': wymagane jest wywołanie metody weryfikacji użytkownika dostępnej na urządzeniu. Jeśli taka opcja nie jest dostępna, żądanie nie zostanie wysłane lokalnie. Oznacza to, że dane uwierzytelniające odpowiedzi zawsze są zwracane z flagą UV ustawioną na true.
  • 'discouraged': odradzamy korzystanie z metody weryfikacji użytkownika. Jednak w zależności od urządzenia weryfikacja użytkownika może zostać przeprowadzona mimo to, a flaga UV może zawierać true lub false.

Przykładowy kod do tworzenia klucza dostępu:

const publicKeyCredentialCreationOptions = {
  // ...
  authenticatorSelection: {
    authenticatorAttachment: 'platform',
    residentKey: 'required',
    requireResidentKey: true,
    userVerification: 'preferred'
  }
};

const credential = await navigator.credentials.create({
  publicKey: publicKeyCredentialCreationOptions
});

Przykładowy kod do uwierzytelniania kluczem:

const publicKeyCredentialRequestOptions = {
  challenge: /* Omitted challenge data... */,
  rpId: 'example.com',
  userVerification: 'preferred'
};

const credential = await navigator.credentials.get({
  publicKey: publicKeyCredentialRequestOptions
});

Którą opcję wybierzesz w przypadku firmy userVerification?

Wartość userVerification, której należy użyć, zależy od wymagań aplikacji oraz wrażeń użytkowników.

Kiedy używać userVerification='preferred'

Jeśli bardziej zależy Ci na wygodzie użytkowników, niż na ochronie, skorzystaj z zasad userVerification='preferred'.

Istnieją środowiska, w których weryfikacja użytkownika jest trudniejsza niż ochrona. Na przykład w systemie macOS, w którym funkcja Touch ID jest niedostępna (ponieważ urządzenie jej nie obsługuje, jest wyłączone lub działa w trybie klamrowym), użytkownik jest proszony o wpisanie hasła systemowego. Utrudnia to uwierzytelnianie, a użytkownik może całkowicie zrezygnować z uwierzytelniania. Jeśli zależy Ci na wyeliminowaniu przeszkód, użyj userVerification='preferred'.

Zrzut ekranu z oknem klucza dostępu w systemie macOS, który pojawia się, gdy czytnik Touch ID jest niedostępny. Okno zawiera takie informacje jak źródło, z którego pochodzi żądanie uwierzytelnienia, oraz nazwę użytkownika. W prawym górnym rogu okna znajduje się przycisk „Anuluj”.
Okno klucza dostępu wyświetlane w systemie macOS, gdy czytnik Touch ID jest niedostępny.

W przypadku metody userVerification='preferred' flaga UV ma wartość true, jeśli weryfikacja użytkownika się powiedzie, lub false, jeśli weryfikacja użytkownika zostanie pominięta. Na przykład w systemie macOS, w którym funkcja Touch ID jest niedostępna, użytkownik prosi o kliknięcie przycisku pomijania weryfikacji użytkownika. Dane logowania klucza publicznego zawierają flagę UV false.

Flaga UV może być sygnałem w analizie ryzyka. Jeśli próba zalogowania się wydaje się ryzykowna z powodu innych czynników, możesz ustawić dla użytkownika dodatkowe testy zabezpieczające logowanie w sytuacji, gdy nie nastąpiła jego weryfikacja.

Kiedy używać userVerification='required'

Użyj userVerification='required', jeśli uważasz, że zarówno promieniowanie UV, jak i UV są absolutnie konieczne.

Wadą tej opcji jest to, że użytkownik może mieć problemy z logowaniem. Na przykład w systemie macOS, w którym funkcja Touch ID nie jest dostępna, użytkownik zostanie poproszony o wpisanie hasła systemowego.

Dzięki usłudze userVerification='required' możesz mieć pewność, że użytkownik zostanie zweryfikowany na urządzeniu. Sprawdź, czy serwer sprawdza, czy flaga UV to true.

Podsumowanie

Korzystając z weryfikacji użytkownika, osoby uzależnione od klucza mogą ocenić prawdopodobieństwo, że właściciel urządzenia się zaloguje. Może wybrać, czy weryfikacja użytkownika ma być wymagana, czy też opcjonalna w zależności od tego, jak bardzo istotny jest mechanizm zastępczego logowania. Upewnij się, że serwer sprawdza flagi UP i UV pod kątem uwierzytelniania użytkownika klucza dostępu.