src/EventSubscriber/RefreshTokenSubscriber.php line 58

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventSubscriber;
  4. use App\Infrastructure\RequestDto\LoginDto;
  5. use App\Infrastructure\Service\Impl\RefreshJwtTokenServiceImpl;
  6. use App\Infrastructure\Service\Impl\VerifyTokenServiceImpl;
  7. use Exception;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\HttpFoundation\RedirectResponse;
  10. use Symfony\Component\HttpKernel\Event\RequestEvent;
  11. use Symfony\Component\HttpKernel\KernelEvents;
  12. use Symfony\Component\Routing\RouterInterface;
  13. use Symfony\Component\Security\Core\Security;
  14. class RefreshTokenSubscriber implements EventSubscriberInterface
  15. {
  16.     private Security $security;
  17.     private VerifyTokenServiceImpl $verifyAuthToken;
  18.     private RefreshJwtTokenServiceImpl $refreshAuthToken;
  19.     private RouterInterface $router;
  20.     /**
  21.      * @param Security $security
  22.      * @param VerifyTokenServiceImpl $verifyAuthToken
  23.      * @param RefreshJwtTokenServiceImpl $refreshAuthToken
  24.      * @param RouterInterface $router
  25.      */
  26.     public function __construct(
  27.         Security $security,
  28.         VerifyTokenServiceImpl $verifyAuthToken,
  29.         RefreshJwtTokenServiceImpl $refreshAuthToken,
  30.         RouterInterface $router
  31.     ) {
  32.         $this->security $security;
  33.         $this->verifyAuthToken $verifyAuthToken;
  34.         $this->refreshAuthToken $refreshAuthToken;
  35.         $this->router $router;
  36.     }
  37.     /**
  38.      * @return array
  39.      */
  40.     public static function getSubscribedEvents(): array
  41.     {
  42.         return [
  43.             KernelEvents::REQUEST => 'refreshToken'
  44.         ];
  45.     }
  46.     /**
  47.      * @throws Exception
  48.      * @return void
  49.      */
  50.     public function refreshToken(RequestEvent $request)
  51.     {
  52.         if ($this->security->getUser() === null) {
  53.             return;
  54.         }
  55.         $jwtToken $_COOKIE[LoginDto::JWT_TOKEN_COOKIE] ?? null;
  56.         if (!$this->verifyAuthToken->isValidToken($jwtToken)) {
  57.             $jwtToken $this->refreshAuthToken->refresh($_COOKIE[LoginDto::JWT_REFRESH_TOKEN_COOKIE]);
  58.             if ($jwtToken !== null) {
  59.                 $this->security->getUser()->setToken($jwtToken);
  60.                 setcookie(LoginDto::JWT_TOKEN_COOKIE$jwtToken);
  61.             } else {
  62.                 $request->setResponse(new RedirectResponse($this->router->generate('app_logout')));
  63.             }
  64.         }
  65.     }
  66. }