src/Infrastructure/EventSubscriber/AuthByApiTokenSubscriber.php line 31

Open in your IDE?
  1. <?php
  2. namespace App\Infrastructure\EventSubscriber;
  3. use App\Database\Domain\Entity\User\UserAccessToken;
  4. use App\Database\Domain\Repository\AccessTokenRepository;
  5. use App\Infrastructure\Security\AuthManager;
  6. use Symfony\Component\DependencyInjection\ContainerInterface;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Symfony\Component\HttpFoundation\RedirectResponse;
  9. use Symfony\Component\HttpKernel\Event\RequestEvent;
  10. use Symfony\Component\HttpKernel\KernelEvents;
  11. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  12. class AuthByApiTokenSubscriber implements EventSubscriberInterface
  13. {
  14.     private ContainerInterface $container;
  15.     private AuthManager $authManager;
  16.     private AccessTokenRepository $accessTokenRepository;
  17.     public function __construct(
  18.         ContainerInterface $container,
  19.         AuthManager $authManager,
  20.         AccessTokenRepository $accessTokenRepository
  21.     ) {
  22.         $this->container             $container;
  23.         $this->authManager           $authManager;
  24.         $this->accessTokenRepository $accessTokenRepository;
  25.     }
  26.     public function onKernelRequest(RequestEvent $event): void
  27.     {
  28.         $request $event->getRequest();
  29.         if ($event->getRequest()->query->has('referral_code')) {
  30.             $code $event->getRequest()->query->get('referral_code');
  31.             $request->getSession()->set('referral_code'$code);
  32.         }
  33.         if (strpos($request->getPathInfo(), 'api') !== false) {
  34.             return;
  35.         }
  36.         $token          $this->container->get('security.token_storage')->getToken();
  37.         $logoutResponse = new RedirectResponse($this->container->get('router')->generate('user_logout'));
  38.         if ($token && $token->getUser() && !is_string($token->getUser()) &&
  39.             (!$request->cookies->has('token') || !$request->cookies->has('token-expires-at'))
  40.         ) {
  41.             $event->setResponse($logoutResponse);
  42.         }
  43.         if ($token && is_string($token->getUser())) {
  44.             if ($request->cookies->has('token') && $request->cookies->has('token-expires-at')) {
  45.                 /** @var UserAccessToken $accessToken */
  46.                 $accessToken $this->accessTokenRepository->findOneBy(['token' => $request->cookies->get('token')]);
  47.                 if ((null === $accessToken || !$accessToken->isValid()) && $token->getUser()) {
  48.                     $event->setResponse($logoutResponse);
  49.                 }
  50.                 if (null !== $accessToken && $accessToken->isValid() && is_string($token->getUser())) {
  51.                     $token = new UsernamePasswordToken($accessToken->getUser(), null'main'$accessToken->getUser()->getRoles());
  52.                     $this->container->get('security.token_storage')->setToken($token);
  53.                     $session $this->container->get('session');
  54.                     $session->set('_security_main'serialize($token));
  55.                     if (null !== $session->get('login_url')) {
  56.                         $redirectUrl $session->get('login_url');
  57.                         $session->remove('login_url');
  58.                         $response = new RedirectResponse($redirectUrl);
  59.                         $event->setResponse($response);
  60.                     }
  61.                 }
  62.             }
  63.         }
  64.     }
  65.     public static function getSubscribedEvents(): array
  66.     {
  67.         return [
  68.             KernelEvents::REQUEST => ['onKernelRequest'7]
  69.         ];
  70.     }
  71. }