Skip to content

fix(auth): session bypass после revoke API-токенов + Web logout - #462

Merged
biz87 merged 2 commits into
betafrom
fix/issue-409-token-session-revoke
Aug 1, 2026
Merged

fix(auth): session bypass после revoke API-токенов + Web logout#462
biz87 merged 2 commits into
betafrom
fix/issue-409-token-session-revoke

Conversation

@Ibochkarev

Copy link
Copy Markdown
Member

Описание

TokenMiddleware пропускал non-public запросы по одному $_SESSION['ms3']['customer_id'] без проверки API-токена в БД. После revoke на одном устройстве другое с живой PHP-сессией сохраняло доступ. В Web REST не было POST /api/v1/customer/logout, хотя процессор уже существовал.

Исправление:

  • убран session short-circuit; customer_token из session проходит DB-валидацию;
  • stale customer_id без токена очищается через clearClientTokenState();
  • AuthorizedCustomerTrait — только customer через resolveApiToken();
  • POST /api/v1/customer/logoutLogout processor с TokenMiddleware, public route;
  • logout резолвит customer из session/Bearer/cookie, revokeTokens, anonymous token, session_regenerate_id(true).

Тип изменений

  • Исправление бага (non-breaking change)
  • Новая функциональность (non-breaking change)
  • Breaking change
  • Рефакторинг
  • Документация

Связанные Issues

Closes #409

Как это было протестировано?

cd core/components/minishop3
php -l src/Middleware/TokenMiddleware.php              # exit 0
php -l src/Controllers/Api/Web/AuthorizedCustomerTrait.php  # exit 0
php -l src/Processors/Api/Customer/Logout.php            # exit 0
php -l config/routes/web.php                           # exit 0
php tests/TokenSessionRevokePolicyTest.php             # exit 0
composer ci:php                                        # exit 0 (14 smoke)
  • Ручное тестирование (анализ auth flow + review battery)
  • Автоматические тесты
  • Тестирование на разных версиях PHP/MODX

Чеклист

  • Код соответствует стилю проекта
  • Изменения не ломают существующую функциональность
  • Лексиконы — n/a (используются существующие ключи)
  • CHANGELOG — release-time

Дополнительные заметки

Deferred (follow-up): snippet-слой ms3_customer / CustomerPageService всё ещё может опираться на session customer_id; CustomerProfileController / CustomerEmailController читают session напрямую (middleware на их роутах уже синхронизирует session после валидации токена).

@Ibochkarev
Ibochkarev requested a review from biz87 July 28, 2026 05:37
@Ibochkarev Ibochkarev added bug Something isn't working priority: high Важно исправить в ближайшее время labels Jul 28, 2026
@Ibochkarev
Ibochkarev force-pushed the fix/issue-409-token-session-revoke branch 2 times, most recently from 542cb7f to 79c3439 Compare July 29, 2026 11:31
Remove customer_id-only auth in TokenMiddleware and AuthorizedCustomerTrait,
add POST /api/v1/customer/logout with token-aware Logout processor, and
regenerate session id on logout.
@Ibochkarev
Ibochkarev force-pushed the fix/issue-409-token-session-revoke branch from 79c3439 to 9fffbb7 Compare August 1, 2026 09:37
@biz87
biz87 merged commit 72ee0eb into beta Aug 1, 2026
3 checks passed
@biz87
biz87 deleted the fix/issue-409-token-session-revoke branch August 1, 2026 16:19
biz87 pushed a commit that referenced this pull request Aug 1, 2026
The Web API returned 400 for unauthenticated / invalid-login / throttled requests, so clients could not distinguish them for retry/UX.

- Unauthenticated profile/email -> 401; invalid login credentials -> 401; login/register rate-limit and email-resend cooldown -> 429.
- Login/Register web.php closures use Response::fromProcessor(), which reads the failure object's code.
- Response::statusFromProcessorObject validates the code against an allowlist (400/401/404/409/422/429/500/503) so a processor cannot emit an arbitrary status; unknown codes fall back to 400.
- Adds ResponseFromProcessorTest.

Rebased on beta (trivial cosmetic web.php conflict from #462 resolved). Closes #414.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working priority: high Важно исправить в ближайшее время

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] TokenMiddleware: session short-circuit обходит revoke API-токенов + нет Web logout

2 participants