Справочник: суперадмин сети
Ручки этого раздела доступны только суперадмину сети. Любой другой пользователь получает 403 insufficient_role, а запрос из сессии, уже открытой входом под другим пользователем, — 409 nested_impersonation: из-под чужого аккаунта в суперадмин-раздел не попасть. Ручки сетевые, сайт им не нужен. $API — https://onpress.pro/api/v2, $OP_TOKEN — токен суперадмина (op_XXXX).
Все пользователи сети
| Пункт | Ручка | Тело |
|---|---|---|
| Список | GET /admin/users | — |
Список
Вся сеть сразу, постранично. Поиск идёт по имени, почте и логину.
| Параметр | Смысл |
|---|---|
q | строка поиска; пусто — вся сеть |
page | номер страницы, с единицы (по умолчанию 1) |
per | размер страницы, до 100 (по умолчанию 25) |
curl -s -H "Authorization: Bearer $OP_TOKEN" "$API/admin/users?q=anna&page=1&per=25"
{
"success": true,
"users": [
{ "id": 42, "name": "Anna", "email": "anna@example.com", "role": "user", "sites": 3, "registered": "2025-03-01T10:00:00.000Z", "last_login_at": "2026-10-06T09:02:10.000Z", "avatar": "https://secure.gravatar.com/avatar/…?s=96&d=mm&r=g", "is_super_admin": false, "login_methods": [ { "type": "google", "login": "anna@example.com" } ] }
],
"total": 567,
"page": 1,
"per": 25
}
role — superadmin (суперадмин сети), team (тег команды) или user (обычный). sites — число сайтов, где человек администратор; у суперадмина это все живые сайты сети. total — сколько всего под текущий поиск, для постраничной прокрутки.
login_methods — способы входа пользователя: type — google, telegram или password (почта с паролем), login — логин этого способа (почта или Telegram-id). Telegram определяется по данным сети; Google и пароль берутся из реальных провайдеров входа, когда на сервере настроен сервисный ключ, иначе по косвенным признакам сети.
Отказы: 403 insufficient_role — не суперадмин; 409 nested_impersonation — запрос из сессии, открытой входом под пользователем.
Вход под пользователем
| Пункт | Ручка | Тело |
|---|---|---|
| Выдать ссылку | POST /admin/impersonate/{id}/link | — |
| Перейти по ссылке | POST /auth/impersonate/consume | {"token": "<token>"} |
Выдать ссылку
Даёт ссылку на вход под пользователем {id}. Ссылка действует 30 минут и открывается сколько угодно раз в пределах этого окна.
curl -s -X POST "$API/admin/impersonate/42/link" -H "Authorization: Bearer $OP_TOKEN"
{ "success": true, "url": "https://onpress.pro/dashboard/impersonate#<token>", "expires_at": "2026-10-07T10:30:00.000Z", "expires_in": 1800, "user": { "id": 42, "name": "Anna", "email": "anna@example.com" } }
Токен стоит во фрагменте адреса (после #), а не в пути: фрагмент не уходит на сервер, поэтому токен не попадает ни в журналы, ни в заголовок источника. Дашборд читает его из адреса и отправляет телом на переход.
Отказы: 403 impersonation_forbidden — нет права входить под другими; 403 cannot_impersonate_super_admin — под суперадмином может войти только суперадмин; 400 cannot_impersonate_self — под собой нельзя; 404 user_not_found; 409 nested_impersonation.
Перейти по ссылке
Поднимает сессию целевого пользователя, помеченную входом суперадмина. Дальше всё работает ровно с правами цели: тихого повышения прав нет. Вверху дашборда появляется полоса «Вы вошли как … · режим суперадмина» с кнопкой «Выйти из режима» (POST /auth/impersonate/stop), которая возвращает к своему аккаунту. Из такой сессии нельзя ни открыть суперадмин-раздел, ни выдать новую ссылку входа.
curl -s -X POST "$API/auth/impersonate/consume" \
-H 'Content-Type: application/json' -d '{"token": "<token>"}'
Отказы: 410 link_expired — ссылка истекла; 404 link_invalid — ссылка повреждена.
Смена пароля
| Пункт | Ручка | Тело |
|---|---|---|
| Задать пароль | POST /admin/users/{id}/password | {"password": "…"} |
Задать пароль
Задаёт пользователю новый пароль, когда тот не может войти. Пароль передаётся пользователю, дальше он входит по почте и этому паролю. Вход через Google это не отключает — лишь добавляет к аккаунту вход по паролю.
curl -s -X POST "$API/admin/users/42/password" \
-H "Authorization: Bearer $OP_TOKEN" -H 'Content-Type: application/json' \
-d '{"password": "a-strong-password"}'
{ "success": true, "user": { "id": 42, "name": "Anna", "email": "anna@example.com" } }
Пароль — не короче 8 символов. Отказы: 503 firebase_admin_key_missing — на сервере не настроен сервисный ключ, смена пароля пока недоступна; 400 weak_password; 409 firebase_email_taken — почта уже занята другим аккаунтом входа; 404 user_not_found.
Журнал входов
| Пункт | Ручка | Тело |
|---|---|---|
| Записи | GET /admin/impersonation-log | — |
Записи
Последние входы под пользователем и смены пароля: кто, кому, когда и с какого адреса.
curl -s -H "Authorization: Bearer $OP_TOKEN" "$API/admin/impersonation-log?limit=100"
{
"success": true,
"entries": [
{ "event": "start", "actor_id": 1, "actor_email": "admin@example.com", "target_id": 42, "target_email": "anna@example.com", "sid": 100, "ip": "<ip>", "created_at": "2026-10-07T10:05:00.000Z" }
]
}
limit — сколько записей вернуть, до 500 (по умолчанию 100). event — start (вход), link_issued (выдана ссылка), stop (выход), password_set (смена пароля).