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

W tym dokumencie wyjaśniamy, czym jest userVerification w WebAuthn, oraz jak zachowuje się przeglądarka, gdy userVerification jest określony podczas tworzenia lub uwierzytelniania klucza dostępu.

Klucze dostępu są oparte na kryptografii klucza publicznego. Podczas tworzenia klucza dostępu generowana jest para kluczy publiczno-prywatnych. Klucz prywatny jest przechowywany przez dostawcę klucza dostępu, a klucz publiczny jest zwracany na serwer strony powierzającej (RP) w celu przechowywania. Serwer może uwierzytelnić użytkownika, weryfikując podpis podpisany tym samym kluczem dostępu przy użyciu sparowanego klucza publicznego. Flaga „obecność użytkownika” (UP) na danych uwierzytelniających z kluczem publicznym potwierdza, że ktoś wszedł w interakcję z urządzeniem podczas uwierzytelniania.

Weryfikacja użytkownika to opcjonalna warstwa zabezpieczeń, która ma na celu potwierdzenie, że podczas uwierzytelniania obecna była właściwa osoba, a nie jakakolwiek osoba, jak ma to miejsce w przypadku weryfikacji obecności użytkownika. Na smartfonach odbywa się to zwykle za pomocą mechanizmu blokady ekranu, czy to za pomocą danych biometrycznych, kodu PIN czy hasła. Informacje o tym, czy została przeprowadzona weryfikacja użytkownika, są przekazywane w ramach flagi „UV”, która jest zwracana w danych uwierzytelniania podczas rejestracji i uwierzytelniania klucza dostępu.

Zrzut ekranu z oknem weryfikacji użytkownika w pęku kluczy iCloud na komputerze Mac Okno z prośbą o zalogowanie się za pomocą Touch ID zawiera informacje o źródle żądania uwierzytelnienia i nazwie użytkownika. W jego prawym górnym rogu znajduje się przycisk „Anuluj”.
Dialog weryfikacji użytkownika w pęku kluczy iCloud w systemie macOS.
Zrzut ekranu okna weryfikacji użytkownika w Chrome na Androida. Okno dialogowe prosi użytkownika o potwierdzenie tożsamości za pomocą rozpoznawania twarzy lub wykrywania odcisku palca i wyświetla źródło, które wymaga uwierzytelnienia. W lewym dolnym rogu znajduje się opcja weryfikacji za pomocą kodu PIN.
Dialog weryfikacji użytkownika w Chrome na Androida.

Jak na serwerze weryfikowane są wartości UP i UV

Flagi logiczne obecności użytkownika (UP) i weryfikacji użytkownika (UV) są sygnalizowane serwerowi w polu danych uwierzytelniania. Podczas uwierzytelniania zawartość pola danych uwierzytelniania można zweryfikować, weryfikując podpis za pomocą zapisanego klucza publicznego. Dopóki podpis jest prawidłowy, serwer może uznać flagi za autentyczne.

Ilustracja struktury danych uwierzytelniania. Od lewej do prawej każda sekcja struktury danych zawiera „RP ID HASH” (32 bajty), „FLAGS” (1 bajt), „COUNTER” (4 bajty, uint32 w formacie big-endian), „ATTESTE CRED. DATA (o zmiennej długości, jeśli występuje) i EXTENSIONS (o zmiennej długości, jeśli występuje (CBOR)). Sekcja „FLAGS” jest rozwinięta i zawiera listę potencjalnych flag oznaczonych etykietami od lewej do prawej: „ED”, „AT”, „0”, „BS”, „BE”, „UV”, „0” i „UP”.
Pola danych Authenticatora w danych logowania z kluczem publicznym.

Podczas rejestracji i uwierzytelniania klucza dostępu serwer powinien sprawdzić, czy flaga UP ma wartość true, a flaga UV ma wartość true lub false, w zależności od wymagań.

Określanie parametru userVerification

Zgodnie ze specyfikacją WebAuthn punkt dostępu dla użytkowników może zażądać weryfikacji użytkownika za pomocą parametru userVerification zarówno podczas tworzenia, jak i potwierdzania danych logowania. Może ono przyjmować wartości 'preferred', 'required' lub 'discouraged', co oznacza odpowiednio:

  • 'preferred' (domyślnie): preferowana jest metoda weryfikacji użytkownika na urządzeniu, ale można ją pominąć, jeśli nie jest dostępna. Dane uwierzytelniające w odpowiedzi zawierają wartość flagi weryfikacji użytkownika true, jeśli weryfikacja została przeprowadzona, i false, jeśli nie została przeprowadzona.
  • 'required': wymagane jest wywołanie metody weryfikacji użytkownika dostępnej na urządzeniu. Jeśli wartość jest niedostępna, żądanie nie zostanie zrealizowane lokalnie. Oznacza to, że dane uwierzytelniające odpowiedzi są zawsze zwracane z flagą UV ustawioną na true.
  • 'discouraged': nie zalecamy używania metody weryfikacji użytkownika. W zależności od urządzenia weryfikacja użytkownika może jednak zostać przeprowadzona, a flaga UV może zawierać wartość true lub false.

Przykładowy kod do tworzenia kluczy dostępu:

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

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

Przykładowy kod uwierzytelniania za pomocą klucza dostępu:

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

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

Którą opcję należy wybrać w przypadku userVerification?

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

Kiedy używać userVerification='preferred'

Użyj userVerification='preferred', jeśli stawiasz wygodę użytkowników ponad ochroną.

W niektórych środowiskach weryfikacja użytkownika powoduje więcej problemów niż zapewnia ochronę. 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 tradycyjnej obudowy), użytkownik zostanie poproszony o wpisanie hasła systemowego. Powoduje to trudności, a użytkownik może całkowicie zrezygnować z uwierzytelniania. Jeśli ważniejsze jest dla Ciebie wyeliminowanie tarcia, użyj userVerification='preferred'.

Zrzut ekranu z oknem z kluczem dostępu w systemie macOS, który pojawia się, gdy funkcja Touch ID jest niedostępna. Okno zawiera informacje takie jak źródło żądające uwierzytelnienia oraz nazwę użytkownika. W jego prawym górnym rogu znajduje się przycisk „Anuluj”.
W systemie macOS okno klucza dostępu wyświetlane, gdy Touch ID jest niedostępne.

W przypadku ustawienia userVerification='preferred' flaga UV ma wartość true, jeśli weryfikacja użytkownika została przeprowadzona pomyślnie, a false, jeśli weryfikacja użytkownika została pominięta. Na przykład w systemie macOS, w którym funkcja Touch ID jest niedostępna, użytkownik jest proszony o kliknięcie przycisku w celu pominięcia 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 logowania wydaje się ryzykowna z innych powodów, możesz wyświetlić użytkownikowi dodatkowe testy zabezpieczające logowanie, jeśli nie została przeprowadzona weryfikacja użytkownika.

Kiedy używać funkcji userVerification='required'

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

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

Dzięki userVerification='required' możesz mieć pewność, że weryfikacja użytkownika zostanie przeprowadzona na urządzeniu. Upewnij się, że serwer weryfikuje, czy flaga UV ma wartość true.

Podsumowanie

Dzięki weryfikacji użytkownika strony używające kluczy dostępu mogą oszacować prawdopodobieństwo zalogowania się przez właściciela urządzenia. Użytkownicy mogą zdecydować, czy wymagać weryfikacji użytkownika, czy też pozostawić tę opcję jako opcjonalną w zależności od tego, jak bardzo mechanizm logowania zapasowego wpływa na proces użytkownika. Upewnij się, że serwer sprawdza flagę UP i UV w celu uwierzytelniania użytkownika za pomocą klucza dostępu.