<?php declare(strict_types=1);
namespace Sq\GraphQL\EventSubscriber\Security;
use Sq\GraphQL\Security\TokenManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class RefreshCookieSubscriber implements EventSubscriberInterface
{
/** @var \Sq\GraphQL\Security\TokenManager */
private $tokenManager;
/** @var \Symfony\Component\HttpFoundation\Cookie|null */
private $cookie;
public function __construct(TokenManager $tokenManager)
{
$this->tokenManager = $tokenManager;
$this->cookie = null;
}
public function setCookie(Cookie $cookie): void
{
$this->cookie = $cookie;
}
public function checkIfRefreshCookieNeedsUpdating(RequestEvent $event): void
{
$request = $event->getRequest();
$refreshToken = $request->cookies->get(TokenManager::REFRESH_COOKIE_NAME);
if (is_string($refreshToken) && !empty($refreshToken))
{
$newRefreshCookie = $this->tokenManager->exchangeRefreshTokenForNewCookieIfExpiring($refreshToken);
if ($newRefreshCookie instanceof Cookie)
{
$this->setCookie($newRefreshCookie);
}
}
}
public function addCookieToResponse(ResponseEvent $event): void
{
$response = $event->getResponse();
if ($this->cookie !== null)
{
$response->headers->setCookie($this->cookie);
}
}
public static function getSubscribedEvents(): iterable
{
return [
KernelEvents::REQUEST => ['checkIfRefreshCookieNeedsUpdating', 0],
KernelEvents::RESPONSE => ['addCookieToResponse', 0],
];
}
}