<?php
/**
* Class JWTRefreshCookieSubscriber
* @package MWS\UserBundle\EventSubscriber
* @author Martin Walther <martin@myweb.solutions>
*
* (c) MyWebSolutions
*/
namespace MWS\UserBundle\EventSubscriber;
use Lexik\Bundle\JWTAuthenticationBundle\Event\JWTAuthenticatedEvent;
use Lexik\Bundle\JWTAuthenticationBundle\Events;
use Lexik\Bundle\JWTAuthenticationBundle\Security\Http\Authentication\AuthenticationSuccessHandler;
use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\User\UserInterface;
class JWTRefreshCookieSubscriber implements EventSubscriberInterface
{
private array $payload = [];
private UserInterface $user;
private JWTManager $jwtManager;
private array $cookieProviders;
/**
* @param JWTManager $jwtManager
* @param array $cookieProviders
*/
public function __construct(JWTManager $jwtManager, array $cookieProviders = [])
{
$this->jwtManager = $jwtManager;
$this->cookieProviders = $cookieProviders;
}
public static function getSubscribedEvents(): array
{
return [
Events::JWT_AUTHENTICATED => 'onAuthenticatedAccess',
KernelEvents::RESPONSE => 'onAuthenticatedResponse'
];
}
public function onAuthenticatedAccess(JWTAuthenticatedEvent $event)
{
$this->payload = $event->getPayload();
$this->user = $event->getToken()->getUser();
}
public function onAuthenticatedResponse(ResponseEvent $event)
{
if ($this->payload && $this->user) {
$jwt = $this->jwtManager->create($this->user);
$response = $event->getResponse();
foreach ($this->cookieProviders as $cookieProvider) {
$response->headers->setCookie($cookieProvider->createCookie($jwt));
}
}
}
}