<?php
namespace App\EventListener;
use Jenssegers\Agent\Agent;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\HttpUtils;
use Symfony\Component\HttpFoundation\RequestStack;
use App\Api\Security\Exception\UserNotMatchException;
use Symfony\Component\Security\Core\User\UserInterface;
use Gesdinet\JWTRefreshTokenBundle\Model\RefreshTokenInterface;
use Lexik\Bundle\JWTAuthenticationBundle\Event\JWTCreatedEvent;
use Gesdinet\JWTRefreshTokenBundle\Model\RefreshTokenManagerInterface;
use Gesdinet\JWTRefreshTokenBundle\Request\Extractor\ExtractorInterface;
use Lexik\Bundle\JWTAuthenticationBundle\Event\AuthenticationSuccessEvent;
use Gesdinet\JWTRefreshTokenBundle\Generator\RefreshTokenGeneratorInterface;
use Gesdinet\JWTRefreshTokenBundle\EventListener\AttachRefreshTokenOnSuccessListener as EventListenerAttachRefreshTokenOnSuccessListener;
use App\Entity\RefreshToken;
class AttachRefreshTokenOnSuccessListener extends EventListenerAttachRefreshTokenOnSuccessListener
{
/**
* @param int $ttl
* @param string $tokenParameterName
* @param bool $singleUse
*/
public function __construct(
RefreshTokenManagerInterface $refreshTokenManager,
$ttl,
RequestStack $requestStack,
$tokenParameterName,
$singleUse,
RefreshTokenGeneratorInterface $refreshTokenGenerator,
ExtractorInterface $extractor,
array $cookieSettings,
private EntityManagerInterface $entityManager,
) {
$this->refreshTokenManager = $refreshTokenManager;
$this->ttl = $ttl;
$this->requestStack = $requestStack;
$this->tokenParameterName = $tokenParameterName;
$this->singleUse = $singleUse;
$this->refreshTokenGenerator = $refreshTokenGenerator;
$this->extractor = $extractor;
$this->cookieSettings = array_merge([
'enabled' => false,
'same_site' => 'lax',
'path' => '/',
'domain' => null,
'http_only' => true,
'secure' => true,
'remove_token_from_body' => true,
], $cookieSettings);
}
public function attachRefreshToken(AuthenticationSuccessEvent $event): void
{
parent::attachRefreshToken($event);
$user = $event->getUser();
if (!$user instanceof UserInterface) {
return;
}
if ($data = $event->getData()) {
$refreshTokenString = $data[$this->tokenParameterName];
if ($refreshTokenRepository = $this->entityManager->getRepository(RefreshToken::class)) {
if ($refreshTokenEntity = $refreshTokenRepository->findOneBy(['refresh_token' => $refreshTokenString])) {
$refreshTokenEntity->setExternalUserId($user->getId());
if ($uuid = $user->getUuid()) {
$refreshTokenEntity->setUuid($uuid);
}
$this->entityManager->persist($refreshTokenEntity);
$this->entityManager->flush();
}
}
}
}
}