JwtAuthMiddleware.php 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <?php
  2. namespace Middlewares;
  3. use Firebase\JWT\JWT;
  4. use Firebase\JWT\Key;
  5. use Libs\Database;
  6. use Libs\ResponseLib;
  7. use Psr\Http\Message\ServerRequestInterface;
  8. use React\Http\Message\Response;
  9. class JwtAuthMiddleware
  10. {
  11. private string $jwtSecret;
  12. public function __construct()
  13. {
  14. // Carrega a chave secreta do .env (ex: JWT_SECRET=seu-segredo-aqui)
  15. $this->jwtSecret = $_ENV['JWT_SECRET'] ?? 'default-secret-fallback'; // Use um fallback seguro em dev
  16. }
  17. public function __invoke(ServerRequestInterface $request, callable $next)
  18. {
  19. $authHeader = $request->getHeaderLine('Authorization');
  20. if (empty($authHeader) || !preg_match('/Bearer\s+(.*)/', $authHeader, $matches)) {
  21. return ResponseLib::sendFail("Unauthorized: Missing or invalid Authorization header", [], "E_VALIDATE")->withStatus(401);
  22. }
  23. $token = $matches[1];
  24. try {
  25. $decoded = JWT::decode($token, new Key($this->jwtSecret, 'HS256'));
  26. $userId = $decoded->sub ?? null;
  27. $userEmail = $decoded->email ?? $decoded->username ?? null;
  28. if (empty($userId) || empty($userEmail)) {
  29. return ResponseLib::sendFail("Unauthorized: Invalid JWT claims", [], "E_VALIDATE")->withStatus(401);
  30. }
  31. $pdo = Database::pdo();
  32. $stmt = $pdo->prepare("SELECT user_id, user_email FROM \"user\" WHERE user_id = :user_id AND user_email = :user_email AND user_deleted_at = 'infinity'");
  33. $stmt->execute(['user_id' => $userId, 'user_email' => mb_strtolower(trim($userEmail))]);
  34. $user = $stmt->fetch(\PDO::FETCH_ASSOC);
  35. if (!$user) {
  36. return ResponseLib::sendFail("Unauthorized: Invalid or inactive user", [], "E_VALIDATE")->withStatus(401);
  37. }
  38. $request = $request
  39. ->withAttribute('api_user', $user['user_email'])
  40. ->withAttribute('api_user_id', $user['user_id'])
  41. ->withAttribute('user_email', $user['user_email'])
  42. ->withAttribute('user_id', $user['user_id']);
  43. return $next($request);
  44. } catch (\Exception $e) {
  45. return ResponseLib::sendFail("Unauthorized: " . $e->getMessage(), [], "E_VALIDATE")->withStatus(401);
  46. }
  47. }
  48. }