Как реализовать FIDO U2F с помощью API Webauthn?

В настоящее время я использую window.u2f API для реализации двухфакторной аутентификации U2F с моим сайтом. Они изначально доступны в Firefox (когда включен флаг about:config) и через Chromium с библиотекой u2f-api.js.

Моя реализация использует window.u2f.register(...) во время настройки ключа и window.u2f.sign(...) во время входа.

Я читал, что новый API веб-аутентификации обратно совместим и поддерживает FIDO U2F, однако я не могу найти никакой информации о том, как его реализовать. Кажется, что все примеры демонстрируют только FIDO2 без пароля, что я не хочу делать.

Как мне реализовать FIDO U2F с эквивалентным window.u2f.register а также window.u2f.sign функции с использованием API веб-аутентификации?

1 ответ

Отличный вопрос Некоторые невероятные примеры реализации U2F можно найти в учетной записи Yubico на Github. Более конкретно, если вам нужен рабочий пример регистрации ключа и его аутентификации с использованием javascript на стороне клиента, реализация криптографии на бэкэнде с API Flask, этот пример находится здесь. Он поддерживает как FIDO2, так и устаревший U2F. Кроме того, если вы хотите получить видео с кем-то, проходящим пошаговый пример того, как работает реализация, то оно находится здесь. Надеюсь, это поможет:)

Вы можете прочитать это, чтобы понять, что они подразумевают под обратной совместимостью.

Вещи, которые будут выделены для вас

Аутентификатор CTAP1/U2F возвращает ошибку команды или неправильно отформатированный ответ CBOR. При любом сбое платформа может использовать протокол CTAP1/U2F.

WebAuthn связывается с аутентификатором сообщениями CBOR. Если аутентификатор не поддерживает FIDO2, аутентификатор вернет код ошибки, тогда WebAuthn свяжется с аутентификатором с помощью необработанных сообщений U2F.

Вы можете просто реализовать WebAuthn как то, что вы прочитали. API веб-аутентификации

Вы можете сослаться на это для вашей реализации

@kspearrin, вот решение, которое у меня работает.

У меня есть пользователи, зарегистрированные с использованием U2F (u2f-api.js). На самом деле перейти на WebAuthn просто. Все новые регистрации будут использовать WebAuthn, а все проверки будут использовать WebAuthn с параметром расширения.

U2F

Registration - window.u2f.register
Verification - window.u2f.sign

WebAuthn

Registration - navigator.credentials.create
Verification - navigator.credentials.get

Совместимость для зарегистрированных пользователей U2F:

При использовании navigator.credentials.get() обязательно установите для extension.appid значение параметра U2F appId. В моем случае я использую URL-адрес origins.json.

https://developer.mozilla.org/en-US/docs/Web/API/PublicKeyCredentialRequestOptions/extensions

Наконец, вам нужно будет реализовать функции WebAuthn как на стороне клиента, так и на стороне сервера. В зависимости от вашей платформы доступно множество библиотек. Ответы из WebAuthn содержат данные в формате ArrayBuffer. Единственное, что мне нужно было выяснить, - это правильно передать данные ArrayBuffer между клиентом и сервером. Мне пришлось преобразовать их в base64, прежде чем отправлять на сервер и обратно. В основном вам нужно массировать формат данных, чтобы он работал.

Другие вопросы по тегам