Метод аутентификации WebAuthn
Метод webauthn позволяет аутентифицироваться в Deckhouse Stronghold с помощью FIDO2-совместимых аутентификаторов и passkeys. Поддержка WebAuthn появилась в Stronghold, начиная с версии 1.17.
Этот способ подходит для безпарольного входа в веб-интерфейс Stronghold и для интеграции с собственными веб-приложениями, которые работают с HTTP API Stronghold. Перед началом работы убедитесь, что браузер и устройство пользователя поддерживают WebAuthn.
Как это работает
WebAuthn использует двухшаговый сценарий:
- Stronghold выдает браузеру параметры для регистрации или входа.
- Браузер обращается к аутентификатору пользователя.
- Результат проверки отправляется обратно в Stronghold, после чего Stronghold выдает токен.
Для входа используются эндпоинты auth/<mount>/login/begin и auth/<mount>/login/finish. Для первичной привязки passkey используются auth/<mount>/register/begin и auth/<mount>/register/finish.
Конфигурация
Метод нужно предварительно включить и настроить. Основные параметры:
rp_id- идентификаторRelying Party. Обычно это DNS-имя Stronghold. Хост вrp_idдолжен совпадать с хостом origin, из которого выполняется аутентификация.rp_display_name- отображаемое имя сервиса для браузера и аутентификатора. Если параметр не задан, Stronghold использует значениеrp_id.rp_origins- список разрешенных origin, с которых браузер может выполнятьWebAuthn-операции.auto_registration- еслиtrue(по умолчанию), пользователь может самостоятельно зарегистрировать passkey. Еслиfalse, пользователя нужно заранее создать через путьuser/.
Включение метода
d8 stronghold auth enable webauthnПо умолчанию метод будет доступен по пути auth/webauthn. При необходимости можно использовать другой путь монтирования:
d8 stronghold auth enable -path=my-passkeys webauthnНастройка Relying Party
d8 stronghold write auth/webauthn/config \
rp_id="stronghold.example.com" \
rp_display_name="Deckhouse Stronghold" \
rp_origins="https://stronghold.example.com"Пример конфигурации, в которой самостоятельная регистрация отключена:
d8 stronghold write auth/webauthn/config \
rp_id="stronghold.example.com" \
rp_display_name="Deckhouse Stronghold" \
rp_origins="https://stronghold.example.com" \
auto_registration=falseПредварительное создание пользователя
Если auto_registration=false, администратор должен заранее создать пользователя и назначить ему параметры будущего токена:
d8 stronghold write auth/webauthn/user/alice \
display_name="Alice Doe" \
token_policies="developers" \
token_ttl="1h"Через путь auth/webauthn/user/<name> можно:
- заранее создать пользователя для регистрации;
- изменить
display_name; - назначить параметры токена, например
token_policies,token_ttl,token_max_ttlиtoken_period; - посмотреть метаданные пользователя и количество привязанных учетных данных
WebAuthn; - удалить пользователя вместе с его зарегистрированными passkey.
Вход через UI
Веб-интерфейс Stronghold поддерживает WebAuthn напрямую.
Для первой регистрации passkey:
- Выберите метод входа
WebAuthn. - Отключите опцию
Use passkey picker, чтобы в форме появилось полеUsername. - Введите имя пользователя и нажмите
Register. - Подтвердите операцию на устройстве или в менеджере passkeys.
Для последующих входов доступны два режима:
- с включенной опцией
Use passkey pickerбраузер покажет список сохраненных обнаруживаемых учетных данных, и имя пользователя можно не вводить; - с отключенной опцией пользователь явно вводит
Username, после чего браузер предлагает подходящий passkey для этого пользователя.
Регистрация и вход через API
Ниже показан общий сценарий для интеграции с собственным веб-приложением.
Регистрация passkey
- Запросите параметры регистрации:
curl \
--request POST \
--data '{"username":"alice"}' \
https://stronghold.example.com/v1/auth/webauthn/register/beginПередайте полученные
publicKey-параметры вnavigator.credentials.create(...)в браузере.Завершите регистрацию, отправив результат обратно в Stronghold:
{
"username": "alice",
"credential": {
"id": "...",
"rawId": "...",
"type": "public-key",
"response": {
"clientDataJSON": "...",
"attestationObject": "..."
}
}
}Запрос отправляется на POST /v1/auth/webauthn/register/finish.
Вход
- Запросите параметры входа:
curl \
--request POST \
--data '{"username":"alice"}' \
https://stronghold.example.com/v1/auth/webauthn/login/beginДля входа через passkey picker можно не передавать username.
Передайте полученные параметры в
navigator.credentials.get(...).Завершите вход, отправив ответ аутентификатора на
POST /v1/auth/webauthn/login/finish:
{
"username": "alice",
"credential": {
"id": "...",
"rawId": "...",
"type": "public-key",
"response": {
"clientDataJSON": "...",
"authenticatorData": "...",
"signature": "...",
"userHandle": "..."
}
}
}В ответе Stronghold возвращает токен в поле auth.client_token.
Практические замечания
- Используйте
rp_origins, которые точно соответствуют реальным адресам Stronghold UI или вашего приложения. - Для production-сценариев удобно отключать
auto_registrationи предварительно создавать пользователей с нужными политиками. WebAuthnособенно полезен для безпарольного входа в UI, но для машинных сценариев обычно лучше подходятAppRole,JWTилиKubernetes.