docs(auth): исправить устаревшее описание авторизации
Документация утверждала, что доступ админский и задаётся заголовком X-Admin-Token со значением ADMIN_PASSWORD, и что без ADMIN_PASSWORD сервер не стартует. Ни то, ни другое не верно: - X-Admin-Token в server.js отсутствует полностью, авторизация держится на сессиях: POST /api/auth/login (bcrypt) выдаёт токен, который клиент шлёт в X-Auth-Token. Проверено на живом стенде: X-Auth-Token -> 200, X-Admin-Token -> 401 на /api/auth/me и /api/users; - ADMIN_PASSWORD участвует только в ensureFirstAdmin() — создании первого админа в пустой БД. Без него сервер пишет предупреждение и стартует; - роли и филиалы: requireAuth (любой активный), requireAdmin (role=admin, самодостаточный), optionalAuth; не-admin ограничены user_branches через branchScope/branchWhere — это в доках не описывалось. Заодно curl-пример проверки авторизации в AGENTS.md вёл на GET /api/groups, который публичный (optionalAuth) и отвечает 200 без токена, то есть авторизацию не проверял. Переведён на /api/auth/me. Секрет Gitea убран из URL remote в ~/.git-credentials (600) — deploy.sh работает без промпта.
This commit is contained in:
@@ -99,7 +99,8 @@ docker compose exec app md5sum /app/server.js # совпадает с md5sum
|
||||
|
||||
| Переменная | По умолчанию | Назначение |
|
||||
|------------------|--------------------|-------------------------------------|
|
||||
| `ADMIN_PASSWORD` | — (обязательно) | Пароль администратора (X-Admin-Token). Без него сервер не стартует |
|
||||
| `ADMIN_PASSWORD` | — (обязательно) | Пароль первого администратора, создаётся в пустой БД. Не является способом авторизации в API |
|
||||
| `ADMIN_USERNAME` | `admin` | Логин первого администратора |
|
||||
| `DB_PASSWORD` | — (обязательно) | Пароль пользователя `app` в PostgreSQL |
|
||||
| `REDIS_PASSWORD` | — (обязательно) | Пароль Redis (`--requirepass`) |
|
||||
| `REDIS_PREFIX` | `whatido` | Префикс ключей Redis — свой для каждого инстанса |
|
||||
@@ -391,7 +392,7 @@ node api.smoketest.js # сквозная проверка API (нужен
|
||||
|
||||
## Безопасность
|
||||
|
||||
- **Пароль администратора** обязателен (`ADMIN_PASSWORD`); фолбэка на `admin` нет.
|
||||
- **Пароль администратора** обязателен (`ADMIN_PASSWORD`) — он создаёт первого админа в пустой БД; фолбэка на `admin` нет. Самостоятельной роли в API не даёт: доступ только по сессиям.
|
||||
- **CORS отключён** — кросс-доменные запросы к API запрещены.
|
||||
- **Rate limiting** по IP на публичные роуты: `POST /api/entries` — 10 запросов / 15 мин, загрузка файлов и share-ссылки — 300 / 15 мин.
|
||||
- **Загрузки** ограничены: 30 МБ суммарно на запись, 10 МБ на файл; заблокированы опасные расширения (`.html`, `.js`, `.svg`, `.xml`, `.exe` и др.); SVG не отдаётся inline.
|
||||
@@ -419,7 +420,26 @@ node api.smoketest.js # сквозная проверка API (нужен
|
||||
| `POST` | `/api/restore` | Восстановить из бэкапа |
|
||||
| `GET` | `/api/dashboard`, `/api/stats` | Статистика |
|
||||
|
||||
Защищённые админ-маршруты требуют заголовок `X-Admin-Token` с `ADMIN_PASSWORD`.
|
||||
Авторизация — по сессиям, не по статическому токену:
|
||||
|
||||
1. `POST /api/auth/login` с `username` и `password` возвращает `{ token, expires_at }`.
|
||||
2. Токен передаётся в заголовке `X-Auth-Token` во все защищённые запросы; `POST /api/auth/logout` удаляет сессию.
|
||||
3. `GET /api/auth/me` — текущий пользователь (`id`, `username`, `role`, `is_active`, `branch_ids`).
|
||||
|
||||
Заголовок `X-Admin-Token` больше не поддерживается. Маршруты помечены `requireAuth` (любой активный пользователь) или `requireAdmin` (только `role = admin`); филиалы не-admin ограничены его `user_branches`.
|
||||
|
||||
Защищённые маршруты:
|
||||
|
||||
| Метод | Путь | Доступ |
|
||||
|---|---|---|
|
||||
| `GET/POST/PUT/DELETE` | `/api/users`, `/api/users/:id` | admin |
|
||||
| `GET/POST/DELETE` | `/api/bans` | admin |
|
||||
| `GET/POST/PUT/DELETE` | `/api/branches`, `/api/branches/:id` | admin (список — любой активный) |
|
||||
| `GET/POST/DELETE` | `/api/settings` | admin |
|
||||
| `GET` | `/api/audit` | admin |
|
||||
| `GET` | `/api/backup`, `POST /api/restore` | admin |
|
||||
|
||||
Сессия хранится в таблице `sessions` (срок 30 дней) и кэшируется в Redis на 30 секунд.
|
||||
|
||||
## Структура проекта
|
||||
|
||||
|
||||
Reference in New Issue
Block a user