Auth-RBAC · Login

Email/password логин в admin BFF и POS BFF. JWT, refresh, logout.

Endpoints

POST /api/v1/admin/auth/login           email + password → JWT (HS256, exp 15min)
POST /api/v1/admin/auth/refresh         refresh_token → новый JWT
GET  /api/v1/admin/auth/me              текущий user
POST /api/v1/admin/auth/logout
POST /api/v1/admin/auth/forgot-password
POST /api/v1/admin/auth/reset-password
POST /api/v1/pos/auth/login             email + password (POS-web; недоступно снаружи стенда)

JWT payload

{
  "sub": "<user_id>",
  "franchise_id": "00000000-0000-0000-0000-000000000001",
  "role_ids": ["..."],
  "iat": 1777978913,
  "exp": 1777979813
}

Алгоритм: HS256. Exp = 15 минут (expires_in: 900). Refresh token — opaque UUID (не JWT).

Findings

(пока пусто)

Тест-кейсы

TC-AUTH-LOGIN-001 — Валидный логин

Status: ✅ pass · session 2026-05-05 admin@erp.local + правильный пароль (см. private/creds.md) → 200, токен валиден

TC-AUTH-LOGIN-002 — Неверный пароль

Status: ◯ todo Ответ: INVALID_CREDENTIALS 401

TC-AUTH-LOGIN-003 — Несуществующий email

Status: ◯ todo

TC-AUTH-LOGIN-EXPIRED — JWT истёк

Status: ✅ partial (наблюдали в session) Любой запрос → 401 «Invalid token». Нужно перезалогиниться.

TC-AUTH-LOGIN-REFRESH — Refresh token

Status: ◯ todo POST /auth/refresh с refresh_token → новый JWT.

TC-AUTH-LOGIN-LOGOUT — Logout инвалидирует токен

Status: ◯ todo POST /auth/logout → следующий запрос с тем же JWT → 401.

TC-AUTH-LOGIN-CASHIER — Cashier admin-login отказан (F12)

Status: ✅ pass by-design anna@test.local + любой пароль (см. private/creds.md) → INVALID_CREDENTIALS.