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.
Co to jest „weryfikacja użytkownika” w WebAuthn?
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.
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 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ż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 wartość jest niedostępna, żądanie nie zostanie zrealizowane lokalnie. Oznacza to, że dane uwierzytelniające odpowiedzi są zawsze zwracane z flagą UV ustawioną natrue
.'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
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 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'
.
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.