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.
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 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ż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 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
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 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ę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.