src/EventSubscriber/ApiSubscriber.php line 53

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  5. use Symfony\Component\HttpKernel\Event\RequestEvent;
  6. use Symfony\Component\HttpKernel\KernelEvents;
  7. use Symfony\Component\HttpFoundation\JsonResponse;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
  11. use Symfony\Component\Routing\RouterInterface;
  12. class ApiSubscriber implements EventSubscriberInterface
  13. {
  14. private $router;
  15. private $apiPrefix = '/api';
  16. private $apiToken;
  17. public function __construct(RouterInterface $router, string $apiToken)
  18. {
  19. $this->router = $router;
  20. $this->apiToken = $apiToken;
  21. }
  22. public static function getSubscribedEvents()
  23. {
  24. return [
  25. KernelEvents::REQUEST => ['onKernelRequest', 10],
  26. KernelEvents::EXCEPTION => ['onKernelException', 0],
  27. ];
  28. }
  29. public function onKernelRequest(RequestEvent $event)
  30. {
  31. $request = $event->getRequest();
  32. if (strpos($request->getPathInfo(), $this->apiPrefix) === 0 && $request->getPathInfo() !== '/api/doc') {
  33. if ($request->isMethod(Request::METHOD_OPTIONS)) {
  34. return;
  35. }
  36. $token = $request->headers->get('X-API-TOKEN');
  37. if ($token !== $this->apiToken) {
  38. $event->setResponse(new JsonResponse([
  39. 'error' => 'Invalid or missing API token',
  40. 'path' => $request->getPathInfo(),
  41. ], Response::HTTP_UNAUTHORIZED));
  42. }
  43. }
  44. }
  45. public function onKernelException(ExceptionEvent $event)
  46. {
  47. $request = $event->getRequest();
  48. if (strpos($request->getPathInfo(), $this->apiPrefix) === 0) {
  49. $exception = $event->getThrowable();
  50. $statusCode = $exception instanceof HttpExceptionInterface ? $exception->getStatusCode() : Response::HTTP_INTERNAL_SERVER_ERROR;
  51. $event->setResponse(new JsonResponse([
  52. 'error' => $exception->getMessage(),
  53. 'code' => $statusCode,
  54. ], $statusCode));
  55. }
  56. }
  57. }