Пытаюсь реализовать базовый поток веб-аутентификации в приложении React/Node, следуя официальному руководству Webauthn. Мой вызов navigator.credentials.create() работает, и я успешно генерирую объект PublicKeyCredential для данного пользователя; однако я не эксперт по аутентификации и не знаю, что делать дальше и как мне «проверить» возвращенные данные аутентификации?
После успешного завершения API регистрации у меня есть возвращенные clientDataJSON и attestationObject (среди других данных). Я могу проверить, что challenge
в данных клиента соответствует исходному заданию из первоначального запроса. Кроме того, мой декодированный объект аттестации выглядит следующим образом:
{
fmt: 'none',
attStmt: {},
authData: <Buffer 49 96 0d e5 88 0e 8c 68 74 34 17 0f 64 76 60 5b 8f e4 ae b9 a2 86 32 c7 99 5c f3 ba 83 1d 97 63 5d 00 00 00 00 fb fc 30 07 15 4e 4e cc 8c 0b 6e 02 05 ... 102 more bytes>
}
Затем в руководстве показано, как анализировать возвращенные данные аутентификации, и, конечно же, я могу анализировать байты открытого ключа, получая такой объект, как:
{
1: 2,
3: -7,
-1: 1,
-2: Uint8Array(32) ...
-3: Uint8Array(32) ...
}
Однако что мне теперь делать? В руководстве говорится: «Если процесс проверки пройдет успешно, сервер сохранит publicKeyBytes и credentialId в базе данных…»
Что означает «если процесс проверки прошел успешно», нужно ли мне что-то подписывать, используя открытый ключ, чтобы проверить его действительность, или какую-то другую криптографическую проверку?? (Извините, но я относительный авторизатор n00b)
https://webauthn.guide — отличный сайт, но, поскольку вы зашли так далеко, я рекомендую прочитать спецификацию WebAuthn. Здесь более подробно рассматривается, как RP должен обрабатывать ответы на регистрацию и аутентификацию:
https://w3c.github.io/webauthn/#sctn-registering-a-new-credential
В вашем случае вы находитесь на этапе 12, на котором анализируются различные флаги внутри authData
. На шаге 21 вы начнете оценивать значение attStmt
на основе значения fmt
. В вашем примере значение fmt
равно "none"
, так что делать особо не придется. Предположим, что проверка аттестации «завершена успешно» на последующих этапах, и все готово.
...нужно ли мне что-то подписать, используя открытый ключ, чтобы убедиться в его правильности, или какую-то другую криптографическую проверку??
Интересный факт: при возврате "none"
аттестаций подпись отсутствует, поэтому в этом конкретном сценарии вы не будете ни для чего использовать открытый ключ во время регистрации!
Большое спасибо за ссылку и объяснение. Итак, поскольку мой формат аттестации «нет» без сопроводительной подписи и сертификата, то, как вы говорите, я просто проверю флаги и выполню другие шаги, которые могут быть применимы к моему случаю, а затем считаю, что процесс проверки регистрации завершен.