app/GraphQL/EventSubscriber/Security/RefreshCookieSubscriber.php line 31

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Sq\GraphQL\EventSubscriber\Security;
  3. use Sq\GraphQL\Security\TokenManager;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpFoundation\Cookie;
  6. use Symfony\Component\HttpKernel\Event\RequestEvent;
  7. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9. class RefreshCookieSubscriber implements EventSubscriberInterface
  10. {
  11.     /** @var \Sq\GraphQL\Security\TokenManager */
  12.     private $tokenManager;
  13.     /** @var \Symfony\Component\HttpFoundation\Cookie|null */
  14.     private $cookie;
  15.     public function __construct(TokenManager $tokenManager)
  16.     {
  17.         $this->tokenManager $tokenManager;
  18.         $this->cookie null;
  19.     }
  20.     public function setCookie(Cookie $cookie): void
  21.     {
  22.         $this->cookie $cookie;
  23.     }
  24.     public function checkIfRefreshCookieNeedsUpdating(RequestEvent $event): void
  25.     {
  26.         $request $event->getRequest();
  27.         $refreshToken $request->cookies->get(TokenManager::REFRESH_COOKIE_NAME);
  28.         if (is_string($refreshToken) && !empty($refreshToken))
  29.         {
  30.             $newRefreshCookie $this->tokenManager->exchangeRefreshTokenForNewCookieIfExpiring($refreshToken);
  31.             if ($newRefreshCookie instanceof Cookie)
  32.             {
  33.                 $this->setCookie($newRefreshCookie);
  34.             }
  35.         }
  36.     }
  37.     public function addCookieToResponse(ResponseEvent $event): void
  38.     {
  39.         $response $event->getResponse();
  40.         if ($this->cookie !== null)
  41.         {
  42.             $response->headers->setCookie($this->cookie);
  43.         }
  44.     }
  45.     public static function getSubscribedEvents(): iterable
  46.     {
  47.         return [
  48.             KernelEvents::REQUEST => ['checkIfRefreshCookieNeedsUpdating'0],
  49.             KernelEvents::RESPONSE => ['addCookieToResponse'0],
  50.         ];
  51.     }
  52. }