Метод аутентификации WebAuthn
Метод webauthn позволяет аутентифицироваться в Deckhouse Stronghold с помощью FIDO2-совместимых аутентификаторов и passkeys. Поддержка WebAuthn появилась в Stronghold, начиная с версии 1.17.
Этот способ подходит для безпарольного входа в веб-интерфейс Stronghold и для интеграции с собственными веб-приложениями, которые работают с HTTP API Stronghold. Перед началом работы убедитесь, что браузер и устройство пользователя поддерживают WebAuthn.
Как это работает
WebAuthn использует двухшаговый сценарий:
- Stronghold выдаёт браузеру параметры для регистрации или входа.
- Браузер обращается к аутентификатору пользователя.
- Результат проверки отправляется обратно в Stronghold, после чего Stronghold выдаёт токен.
Для входа используются эндпоинты auth/<MOUNT_PATH>/login/begin и auth/<MOUNT_PATH>/login/finish. Для первичной привязки passkey используются auth/<MOUNT_PATH>/register/begin и auth/<MOUNT_PATH>/register/finish.
Конфигурация
Метод нужно предварительно включить и настроить. Основные параметры:
rp_id- идентификаторRelying Party. Обычно это DNS-имя Stronghold. Хост вrp_idдолжен совпадать с хостом origin, из которого выполняется аутентификация.rp_display_name- отображаемое имя сервиса для браузера и аутентификатора. Если параметр не задан, Stronghold использует значениеrp_id.rp_origins- список разрешённых origin, с которых браузер может выполнятьWebAuthn-операции.auto_registration- еслиfalse(по умолчанию), регистрироваться могут только заранее созданные через путьuser/пользователи; еслиtrue, пользователь может зарегистрироваться сам.
Включение метода
- Stronghold в DP
- Stronghold в Linux
d8 stronghold auth enable webauthnstronghold auth enable webauthnПо умолчанию метод будет доступен по пути auth/webauthn. При необходимости можно использовать другой путь монтирования:
- Stronghold в DP
- Stronghold в Linux
d8 stronghold auth enable -path=my-passkeys webauthnstronghold auth enable -path=my-passkeys webauthnНастройка Relying Party
- Stronghold в DP
- Stronghold в Linux
d8 stronghold write auth/webauthn/config rp_id="stronghold.example.com" rp_display_name="Deckhouse Stronghold" rp_origins="https://stronghold.example.com"stronghold write auth/webauthn/config rp_id="stronghold.example.com" rp_display_name="Deckhouse Stronghold" rp_origins="https://stronghold.example.com"Пример конфигурации, в которой самостоятельная регистрация отключена:
- Stronghold в DP
- Stronghold в Linux
d8 stronghold write auth/webauthn/config rp_id="stronghold.example.com" rp_display_name="Deckhouse Stronghold" rp_origins="https://stronghold.example.com" auto_registration=falsestronghold 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, администратор должен заранее создать пользователя и назначить ему параметры будущего токена:
- Stronghold в DP
- Stronghold в Linux
d8 stronghold write auth/webauthn/user/alice display_name="Alice Doe" token_policies="developers" token_ttl="1h"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.