2.1 KiB
2.1 KiB
Аутентификация (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)
- Читает заголовок
authorization(lowercase в Request) - Ожидает формат
Bearer <token> JwtService::verify()→userIdUserProviderInterface::findById($userId)→ user objectnull→AuthException('User not found')- Возвращает
$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).