POST /api/site-admin/verify-totp — Подтвердить TOTP
Сгенерировано из матриц + кода. Правки вносить в источники (
docs/matrices/,server/routes/), не здесь.
| Поле | Значение |
|---|---|
| HTTP | POST /api/site-admin/verify-totp |
| Auth | — |
| Scope токена | read_write |
| PG-функции | api.admin_promote_session, api.get_totp_pending_session |
| Таблицы | — |
| SRM | — (вне SRM, документировано по коду) |
| RP (права) | — |
| Файл роута | server/routes/site-admin.js |
| Статус | по коду (вне SRM) |
Аргументы запроса (best-effort из хендлера; путь-параметры опущены):
| Аргумент | Где | Обяз. | Заметка |
|---|---|---|---|
code | body | подтвердить | |
tempToken | body | подтвердить |
Коды ответов/ошибок (из хендлера): 400, 401 (+ 200) — уточнить причины вручную
Для человека
Как открыть: второй шаг входа администратора платформы. Сразу после ввода пароля на странице входа site-admin (см. login) появляется поле для одноразового кода из приложения-аутентификатора. Введите шестизначный код и подтвердите — откроется Admin Panel.
Завершает двухфакторный вход: проверяет одноразовый код TOTP и, если он верный, открывает полноценную защищённую сессию администратора. Это и есть второй замок: пароль вы уже прошли, теперь подтверждаете, что код сгенерирован вашим аутентификатором.
Код действует короткое время и меняется каждые полминуты; принимается также код из соседнего окна — на случай рассинхронизации часов. Неверный или просроченный код — ошибка 401 («Неверный код»), вход не происходит. Между шагами есть и временной лимит: если затянуть со вторым шагом, промежуточный токен входа истекает, и тогда нужно начинать заново с пароля.
Кто может. Только администратор платформы, у которого подключён TOTP, — как продолжение его собственного входа. Других ролей здесь нет.
Для агента
Это операция site-admin, и она недоступна API-токену ни на каком scope. Второй шаг входа в панель администратора платформы — человеческий: он открывает защищённую cookie-сессию, а не токенную. Агент сюда не ходит.
Путь /api/site-admin/* закрыт для Bearer-токенов в agent-gate (server/auth/agentGate.js) — не входит ни в read-, ни в write-allowlist (закрыто по умолчанию), поэтому вызов с Authorization: Bearer tak_... возвращает 403 (Forbidden for token). Markdown-зеркала нет.
Сам verify-totp — публичный шаг входа (mw=-). Принимает tempToken (из ответа login) и code из аутентификатора; при успехе ставит cookie admin_sid:
curl -X POST https://specbuilder.vnimanie.ai/api/site-admin/verify-totp \ -b admin-cookies.txt -c admin-cookies.txt \ -H "Content-Type: application/json" \ -d '{"tempToken":"0e1f2a3b-...","code":"123456"}'Тело запроса (JSON):
| Поле | Тип | Обяз. | Назначение |
|---|---|---|---|
tempToken | uuid | да | Промежуточный токен из ответа login (step: totp) |
code | string | да | Текущий одноразовый код из аутентификатора |
Ответ 200 — сессия открыта:
{ "step": "done", "admin": { "id": "9c8b7a6d-...", "email": "admin@example.com" } }Неверный/просроченный код или истёкший tempToken → 401.