W tym dokumencie wyjaśniamy, czym jest userVerification
w WebAuthn, oraz jak zachowuje się przeglądarka, gdy podczas tworzenia lub uwierzytelniania klucza dostępu jest podawany parametr userVerification
.
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 trzeciej (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) w 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.


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.

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 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żytkownikatrue
, jeśli weryfikacja została przeprowadzona, ifalse
, jeśli nie została przeprowadzona.'required'
: wymagane jest wywołanie metody weryfikacji użytkownika dostępnej na urządzeniu. Jeśli nie ma takiego adresu, żądanie nie powiedzie się lokalnie. Oznacza to, że dane logowania zawsze zwracają flagę UV ustawioną natrue
.'discouraged'
: nie zalecamy korzystania z 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
lubfalse
.
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 oraz 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'
.

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ępne, 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 niezbędne.
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.