Skip to content

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

Closed

Description

@Ibochkarev

Описание проблемы

  1. TokenMiddleware для non-public роутов пропускает запрос, если в PHP-сессии есть $_SESSION['ms3']['customer_id'], без проверки API-токена.
  2. В Web REST нет маршрута POST /api/v1/customer/logout, хотя процессор Processors\Api\Customer\Logout уже есть и делает revokeTokens(..., 'api').

Итог: logout/revoke на одном клиенте не инвалидирует доступ с другого устройства с живой PHP-сессией; REST-клиент вообще не может корректно завершить сессию.

Шаги воспроизведения

  1. Логин покупателя на Device A и Device B (оба с customer_id в PHP-сессии).
  2. На Device A вызвать Logout-процессор (или вручную revokeTokens для api-токенов).
  3. С Device B (старый PHPSESSID) выполнить GET /api/v1/customer/addresses или PUT /api/v1/customer/profile без валидного API-токена.
  4. Параллельно: POST /api/v1/customer/logout через api.php → 404 Route not found.

Ожидаемое поведение

  • После revoke API-токенов доступ по старой сессии без валидного токена запрещён (или сессия сбрасывается).
  • Web REST предоставляет logout, который чистит session + revoke + выдаёт anonymous token (как процессор).

Фактическое поведение

Middleware short-circuit:

// src/Middleware/TokenMiddleware.php ~79-85
if (!$isPublic && !empty($_SESSION['ms3']['customer_id'])) {
    $customer = $this->modx->getObject(...);
    if ($customer) {
        return null; // токен не проверяется
    }
}

Logout процессор есть (src/Processors/Api/Customer/Logout.php), роута в config/routes/web.php нет.

Окружение

  • MiniShop3: beta / REST API
  • MODX: 3.x
  • PHP: 8.2+

Дополнительный контекст

Связано с #371 (immortal renew) и #369 (token capture), но вектор другой: session bypass после revoke.
AuthorizedCustomerTrait также опирается на $_SESSION['ms3']['customer_id'].

Предлагаемое решение

  • Убрать/сузить session short-circuit: session только как cache после успешной валидации токена; при revoke чистить session keys.
  • Добавить POST /api/v1/customer/logout → Logout processor.
  • При logout: session_regenerate_id / unset customer_id.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions