test(auth): зафиксировать контракт авторизации в smoke-тесте
Документация долго описывала X-Admin-Token как способ авторизации, хотя его нет в коде. Расхождение не ловилось ничем: curl-пример в доках ходил на GET /api/groups, а он публичный (optionalAuth) и отвечает 200 без токена, то есть авторизацию не проверял вообще. Добавлены проверки, которые падают при возврате статического токена: - защищённый маршрут без токена -> 401; - мусорный X-Auth-Token -> 401; - X-Admin-Token (значение ADMIN_PASSWORD) -> 401; - Authorization: Bearer -> 401; - ADMIN_PASSWORD как токен -> 401; - позитивный контроль: валидный токен на admin-маршруте -> 200, иначе проверки выше проходили бы из-за сломанного роута; - /api/groups остаётся публичным -> 200 без токена. Хелпер api() научен принимать произвольные заголовки — иначе X-Admin-Token и Bearer не отправить. AGENTS.md дополнен описанием контракта и пунктом в чеклисте безопасности.
This commit is contained in:
@@ -179,6 +179,12 @@ docker compose start redis # app reconnects on its
|
||||
Verify Redis state through `GET /api/system-info` → `cache` (`driver`, `ready`, `hits`, `misses`,
|
||||
`fallbackOps`, `used_memory_human`, `keys`).
|
||||
|
||||
`api.smoketest.js` also locks the auth contract: only `X-Auth-Token` with a session token
|
||||
authenticates, while `X-Admin-Token`, `Authorization: Bearer` and `ADMIN_PASSWORD` used as a
|
||||
token must all be rejected with 401. If you change the auth scheme, update this test and the
|
||||
Auth notes in this file together — a doc that drifts from the code is the failure mode this
|
||||
guards against.
|
||||
|
||||
---
|
||||
|
||||
## Security Checklist (before any change)
|
||||
@@ -187,6 +193,7 @@ Verify Redis state through `GET /api/system-info` → `cache` (`driver`, `ready`
|
||||
- [ ] File I/O через `storage.*`, ключи объектов не выходят за пределы бакета/`uploads/`
|
||||
- [ ] Rate limiter on new public routes
|
||||
- [ ] Admin routes behind `requireAdmin`
|
||||
- [ ] New auth paths checked against the contract in `api.smoketest.js`, docs updated in the same change
|
||||
- [ ] No secrets in code — only via env vars
|
||||
- [ ] Helmet headers present (already global)
|
||||
- [ ] CORS disabled (no `cors` middleware)
|
||||
|
||||
Reference in New Issue
Block a user