src/EventListener/ApiTokenListener.php line 16

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Repository\ClienteRepository;
  4. use Symfony\Component\HttpKernel\Event\RequestEvent;
  5. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  6. readonly class ApiTokenListener
  7. {
  8. public function __construct(private ClienteRepository $clienteRepository)
  9. {
  10. }
  11. public function onKernelRequest(RequestEvent $event): void
  12. {
  13. $request = $event->getRequest();
  14. if (!str_starts_with($request->getPathInfo(), '/api/') || str_starts_with($request->getPathInfo(), '/api/doc')) {
  15. return;
  16. }
  17. $authHeader = $request->headers->get('Authorization');
  18. if (!$authHeader || !str_starts_with($authHeader, 'Bearer ')) {
  19. throw new AccessDeniedHttpException('Missing or invalid Authorization header.');
  20. }
  21. $token = substr($authHeader, 7);
  22. $cliente = $this->clienteRepository->findOneBy(['token' => $token]);
  23. if (!$cliente) {
  24. throw new AccessDeniedHttpException('Invalid API token.');
  25. }
  26. $request->attributes->set('cliente', $cliente);
  27. }
  28. }