Как реализовать 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, прежде чем отправлять на сервер и обратно. В основном вам нужно массировать формат данных, чтобы он работал.