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.
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.
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, lubfalse
, 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ą natrue
.'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
lubfalse
.
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'
.
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.