Справочник: вход и служебное
Ручки сети, без префикса сайта. Агенту с op_-токеном из этой страницы нужна только GET /health; ручки /auth обслуживают дашборд. Как устроен вход — дашборд и вход.
GET /health
Токен не нужен.
curl -s "$API/health"
{ "ok": true, "db": true, "realm": "prod" }
db: false и код 503 — сервис жив, база недоступна. realm — контур экземпляра (prod у боевого).
Ручки /auth
Все, кроме GET /auth/me, работают только методом POST (GET — 405 method_not_allowed с Allow: POST). Все, кроме /auth/session, работают по кукам сессии; запросы проверяются по Origin (чужой — 403 cross_origin). Ошибки — в форме {code, message, data: {status}}. Попыток входа — до 30 в минуту с адреса (429 too_many_requests).
POST /auth/session
Обменять ID-токен Firebase на сессию. Токен — заголовком Authorization: Bearer <ID-токен Firebase> (или полем id_token). Вход разрешён почтой с паролем и через Google; почта должна быть подтверждена; человек должен быть в сети или приглашён.
Ответ 201 и две httpOnly-куки (короткая сессионная на 15 минут и долгая для продления на 30 дней):
{
"success": true,
"user": { "id": 42, "email": "anna@example.com", "name": "Anna", "is_super_admin": false },
"session": { "id": "…", "expires_at": "…", "expires_in": 900, "realm": "…" }
}
Отказы: 401 missing_id_token, 401 invalid_id_token, 403 email_required, 403 email_not_verified, 403 provider_not_allowed, 403 user_not_found, 403 cross_origin, 503 auth_not_configured.
POST /auth/refresh
Продлить сессию по долгой куке; секрет куки при этом меняется. Ответ — как у /auth/session. Отказы: 401 no_session, 401 session_expired, 403 user_not_found.
POST /auth/logout
Выйти на этом устройстве. Всегда успех: {"success": true, "revoked": 1} (или 0, если сессии уже не было).
POST /auth/logout-all
Выйти на всех устройствах: {"success": true, "revoked": <число>}. Токен API и пароли приложений продолжают работать. Отказы: 401 no_session.
GET /auth/me
Состояние сессии (профиль целиком — GET /me):
{ "success": true, "user": { "id": 42, "email": "anna@example.com", "name": "Anna", "is_super_admin": false }, "session": { "id": "…", "realm": "…" } }
Отказы: 401 no_session, 403 user_not_found.
POST /auth/ticket
Одноразовый билет на две минуты для запроса в первую версию API (/wp-json/onpress/v1/…) на домене сайта, куда кука дашборда не доезжает. Сайт — site_id, blog_id или domain (в теле или строке запроса). Билет предъявляется как Authorization: Bearer <билет> или X-OnPress-Ticket.
Выдаётся только по сессии дашборда. С op_-токеном билет не нужен — первая версия API принимает токен напрямую:
curl -s -X POST "$API/auth/ticket"
{ "code": "no_session", "message": "a ticket is issued against a dashboard session cookie; with an op_ token call the site API directly — it accepts the token itself", "data": { "status": 401 } }
Отказы: 401 no_session, 400 blog_required, 400 invalid_blog_id, 404 site_not_found, 403 insufficient_role, 403 cross_origin.