Тестирование авторизации и токенов API — это проверка того, что доступ получают только корректно аутентифицированные и авторизованные клиенты, а токены выдаются, обновляются, истекают и отзываются по правилам безопасности.
Примеры проверок:
Успешный логин → выдаётся access-token (и при необходимости refresh-token).
Запрос с просроченным токеном → 401 Unauthorized.
Запрос без нужного scope/роли → 403 Forbidden.
Аутентификацию: Basic, API-key, Bearer/JWT, OAuth2/OIDC (Auth Code + PKCE), mTLS.
Авторизацию: роли/права (RBAC), scopes.
Жизненный цикл токена: выдача → использование → истечение (exp) → обновление (refresh) → отзыв/блокировка.
Логин корректными данными → 200 OK + access_token (и refresh_token, если предусмотрен).
Доступ с валидным access-token к защищённому ресурсу → 200 OK, корректные данные.
Обновление токена по валидному refresh → новый access_token, корректные exp/iat.
Scopes/роли: токен со scope payments:write может создавать платеж.
Пример (JWT Bearer):GET /api/v1/payments с заголовком Authorization: Bearer <access_token> → 200 OK.
Неверные креды при логине → 401, без утечки деталей (“user not found” скрываем).
Без токена / пустой токен → 401.
Просроченный токен (exp в прошлом) → 401.
Недостаточные права/неверный scope → 403.
Повторное использование refresh (reuse) при ротации → блокировка сессии/всех токенов.
Подмена алгоритма/подписи JWT (защита от alg=none, неверный iss/aud) → 401.
Токен в URL (query) → запрещено, сервер отклоняет/логирует.
Для JWT проверяем клеймы:
iss, aud, sub — ожидаемые значения;
exp, nbf, iat — время, учитывая clock skew (например, ±60 сек);
scope/roles — соответствуют кейсу;
Подпись валидна, алгоритм только разрешённый (например, RS256/ES256).
Что ещё: разумный TTL (например, access 5–30 мин), короткий access + длинный refresh, шифрование транспорта (HTTPS обязателен), CORS/CSRF для cookie-based сценариев (HttpOnly, Secure, SameSite).
Authorization Code + PKCE для мобильных/SPA: корректность code_verifier/code_challenge.
Consent экран и выдача нужных scopes.
Token introspection/revocation — статус токена и его отзыв.
Logout: серверная инвалидизация сессии/refresh.
Brute-force логина: лимиты, капча/заморозка учётки.
Rate limiting на чувствительные эндпойнты (/login, /token).
Replay-атаки: одноразовость кода авторизации, nonce в OIDC, ротация refresh.
Postman/Insomnia: коллекции с pre-request скриптами (автологин → подставить токен), переменные окружений, тест-скрипты на коды/схемы.
Автотесты API: RestAssured / PyTest + JSON-схемы; мок/стаб внешних IdP при необходимости.
Проверка клеймов: библиотека для декодирования JWT (без доверия к payload, подпись валидируем!).
Логи/аудит: успешные/неуспешные входы, отозванные токены, IP/Device-binding (если есть).
Аутентификация
✅ Логин валидный → 200, есть access (+ refresh).
❌ Логин невалидный → 401, унифицированное сообщение.
Доступ к ресурсу
✅ Authorization: Bearer <valid> → 200.
❌ Без токена → 401.
❌ Токен просрочен → 401.
❌ Нужен scope admin:*, у токена только read:* → 403.
Жизненный цикл
✅ Refresh по валидному → новый access; старый access можно использовать до истечения (или сразу инвалидируется — по дизайну).
❌ Reuse старого refresh после ротации → блок/алерт.
✅ Отзыв (revocation) → любые дальнейшие запросы с этим токеном → 401.
JWT-валидность
❌ Изменённый payload/подпись → 401.
❌ aud/iss не совпадают с конфигом → 401.
✅ nbf в будущем → 401 до наступления времени.
ЛогинPOST /oauth/token
{ "grant_type": "password", "username": "user@test.com", "password": "Secret123!", "scope": "payments:read payments:write" }
Ожидание: 200 + { "access_token": "...", "expires_in": 1800, "refresh_token": "..." }.
Защищённый ресурсGET /api/v1/payments + Authorization: Bearer <access> → 200.
С истёкшим токеном → 401 + семантичная ошибка (например, token_expired).
RefreshPOST /oauth/token
{ "grant_type": "refresh_token", "refresh_token": "<rt-123>" }
Ожидание: новый access_token; старый refresh — отозван (при ротации).
Флаки на времени → добавить допуск по времени (clock skew).
Хранение токена в LocalStorage → для SPA предпочитать cookie HttpOnly + CSRF-защиту.
Токен в URL → запретить, логировать инциденты.
Слишком общие ошибки или, наоборот, утечка деталей → баланс: информативно, без раскрытия внутренностей.
Итог:
Качественные тесты авторизации и токенов покрывают аутентификацию, права (scopes/ролей), жизненный цикл токенов, а также безопасность и устойчивость (лимиты, ротация, отзыв, защита от атак).
Чтобы пожаловаться или сообщить об ошибке, войдите в аккаунт или зарегистрируйтесь.