<?php
namespace App\EventSubscriber;
use App\Service\Member\Jwt\UserJwtManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
class MyBizJwtUserSubscriber implements EventSubscriberInterface
{
public const MYBIZ_JWT_TOKEN = "mybiz-jwt-token";
private TokenStorageInterface $tokenStorage;
private UserJwtManager $userJwtManager;
public function __construct(
TokenStorageInterface $tokenStorage,
UserJwtManager $userJwtManager
)
{
$this->tokenStorage = $tokenStorage;
$this->userJwtManager = $userJwtManager;
}
/**
* @param RequestEvent $event
* @return void
*/
public function onKernelRequest(
RequestEvent $event
): void
{
$request = $event->getRequest();
// on récupère les paramètres de la request
$mybizJwtToken = $event->getRequest()->get(self::MYBIZ_JWT_TOKEN);
// si aucun token n'est envoyé en paramètre
if (null === $mybizJwtToken) {
return;
}
// Si l'utilisateur est deja connecté on le déceonnecte
if (null !== $this->tokenStorage->getToken()) {
$this->tokenStorage->setToken(null);
}
// On récupère l'utilisateur pointé par le JWT
$user = $this->userJwtManager->getUserByJwtToken($mybizJwtToken);
// S'il n'existe pas on ne fait rien
if (null === $user) {
return;
}
// Sinon on connecte l'utilisateur et on l'envoie sur la page demandée
$token = new UsernamePasswordToken($user, $user->getPassword(), ["futures_website"], $user->getRoles());
$this->tokenStorage->setToken($token);
// 🚀 On redirige vers l’URL d’origine demandée par l’utilisateur
$cleanUrl = $request->getUriForPath($request->getPathInfo()); // même URL mais sans le paramètre token
$event->setResponse(new RedirectResponse($cleanUrl));
}
/**
* @return string[]
*/
public static function getSubscribedEvents(): array
{
return [
'kernel.request' => ['onKernelRequest', -10],
];
}
}