You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Bug] TokenMiddleware: session short-circuit обходит revoke API-токенов + нет Web logout #409
TokenMiddleware для non-public роутов пропускает запрос, если в PHP-сессии есть $_SESSION['ms3']['customer_id'], без проверки API-токена.
В Web REST нет маршрута POST /api/v1/customer/logout, хотя процессор Processors\Api\Customer\Logout уже есть и делает revokeTokens(..., 'api').
Итог: logout/revoke на одном клиенте не инвалидирует доступ с другого устройства с живой PHP-сессией; REST-клиент вообще не может корректно завершить сессию.
Шаги воспроизведения
Логин покупателя на Device A и Device B (оба с customer_id в PHP-сессии).
На Device A вызвать Logout-процессор (или вручную revokeTokens для api-токенов).
С Device B (старый PHPSESSID) выполнить GET /api/v1/customer/addresses или PUT /api/v1/customer/profileбез валидного API-токена.
Параллельно: 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-85if (!$isPublic && !empty($_SESSION['ms3']['customer_id'])) {
$customer = $this->modx->getObject(...);
if ($customer) {
returnnull; // токен не проверяется
}
}
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.
Activity
fix(auth): close session bypass after API token revoke + harden Web l…