Files
2026-04-06 18:47:11 +03:00

2.1 KiB
Raw Permalink Blame History

Аутентификация (JWT)

Компоненты

Файл Класс Роль
src/Auth/JwtService.php JwtService Выдача и верификация JWT (HS256, lcobucci/jwt)
src/Auth/AuthMiddleware.php AuthMiddleware Bearer → JwtService → UserProvider → AuthContext
src/Auth/AuthContext.php AuthContext Обёртка над объектом пользователя
src/Auth/UserProviderInterface.php UserProviderInterface Контракт: findById(string): ?object
src/Auth/AuthException.php AuthException → 401 в HttpApplication::dispatch()

JwtService (src/Auth/JwtService.php)

Конфигурируется через Config:

  • jwt.secret — HMAC-ключ (обязателен, иначе RuntimeException при старте)
  • jwt.access_ttl — TTL в секундах
$jwt->issue(string $userId): string     // sub = $userId, iat, exp
$jwt->verify(string $tokenString): string  // возвращает sub (userId), бросает AuthException

Использует lcobucci/jwt, HS256, StrictValidAt (проверяет exp с текущим временем).

AuthMiddleware (src/Auth/AuthMiddleware.php)

  1. Читает заголовок authorization (lowercase в Request)
  2. Ожидает формат Bearer <token>
  3. JwtService::verify()userId
  4. UserProviderInterface::findById($userId) → user object
  5. nullAuthException('User not found')
  6. Возвращает $request->withContext('auth', new AuthContext($user))
// В контроллере:
$auth = $request->get('auth');  // AuthContext
$user = $auth->user;            // объект пользователя (тип зависит от приложения)

Подключение в приложении

В config/services.php нужно забиндить UserProviderInterface:

UserProviderInterface::class => fn($c) => $c->get(UserRepository::class),

UserRepository должен реализовывать UserProviderInterface (findById(string $id): ?object).