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

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

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

Klucze dostępu są tworzone na podstawie 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 W oknie użytkownik jest proszony o zalogowanie się za pomocą Touch ID. Wyświetlana jest nazwa użytkownika oraz źródło, które prosi o uwierzytelnienie. W prawym górnym rogu okna znajduje się przycisk „Anuluj”.
Pętla weryfikacji użytkownika w pęku kluczy iCloud w systemie macOS.
Zrzut ekranu z oknem 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 prosi o uwierzytelnienie. 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.

Schemat 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 „FLAGI” 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 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 RP może poprosić o weryfikację użytkownika za pomocą parametru userVerification zarówno podczas tworzenia, jak i wysyłania oświadczenia. 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 nie ma dostępnego urządzenia, żądanie nie powiedzie się lokalnie. Oznacza to, że w pliku odpowiedzi flaga UV jest zawsze ustawiona na wartość true.
  • 'discouraged': nie zalecamy używania metody weryfikacji użytkownika. Jednak w zależności od urządzenia weryfikacja użytkownika może 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 opcji userVerification='preferred', jeśli ważniejsza jest dla Ciebie wygoda użytkowników niż ochrona.

W niektórych środowiskach weryfikacja użytkownika powoduje więcej problemów niż zapewnia ochronę. Na przykład w systemie macOS, w którym Touch ID jest niedostępny (ponieważ urządzenie go nie obsługuje, jest wyłączony lub jest w trybie clamshell), użytkownik jest proszony o podanie 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 okna hasła w systemie macOS, które pojawia się, gdy Touch ID jest niedostępne. Okno zawiera informacje takie jak źródło żądające uwierzytelnienia oraz nazwę użytkownika. W prawym górnym rogu okna znajduje się przycisk „Anuluj”.
W systemie macOS okno klucza dostępu wyświetlane, gdy Touch ID jest niedostępne.

W przypadku userVerification='preferred' flaga weryfikacji użytkownika ma wartość true, jeśli weryfikacja użytkownika została pomyślnie przeprowadzona, i false, jeśli została pominięta. Na przykład w systemie macOS, w którym Touch ID jest niedostępny, użytkownik jest proszony o kliknięcie przycisku, aby pominąć weryfikację. Dane logowania z kluczem publicznym 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ć 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 Touch ID jest niedostępne, użytkownik musi podać hasło do systemu.

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 korzystające z kluczy dostępu mogą ocenić prawdopodobieństwo zalogowania się właściciela urządzenia. Użytkownicy mogą zdecydować, czy wymagać weryfikacji użytkownika, czy pozostawić ją 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.