vendor/gesdinet/jwt-refresh-token-bundle/EventListener/AttachRefreshTokenOnSuccessListener.php line 95

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the GesdinetJWTRefreshTokenBundle package.
  4.  *
  5.  * (c) Gesdinet <http://www.gesdinet.com/>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Gesdinet\JWTRefreshTokenBundle\EventListener;
  11. use Gesdinet\JWTRefreshTokenBundle\Generator\RefreshTokenGeneratorInterface;
  12. use Gesdinet\JWTRefreshTokenBundle\Model\RefreshTokenInterface;
  13. use Gesdinet\JWTRefreshTokenBundle\Model\RefreshTokenManagerInterface;
  14. use Gesdinet\JWTRefreshTokenBundle\Request\Extractor\ExtractorInterface;
  15. use Lexik\Bundle\JWTAuthenticationBundle\Event\AuthenticationSuccessEvent;
  16. use Symfony\Component\HttpFoundation\Cookie;
  17. use Symfony\Component\Security\Core\User\UserInterface;
  18. use Symfony\Component\HttpFoundation\RequestStack;
  19. class AttachRefreshTokenOnSuccessListener
  20. {
  21.     /**
  22.      * @var RefreshTokenManagerInterface
  23.      */
  24.     protected $refreshTokenManager;
  25.     /**
  26.      * @var int
  27.      */
  28.     protected $ttl;
  29.     /**
  30.      * @var RequestStack
  31.      */
  32.     protected $requestStack;
  33.     /**
  34.      * @var string
  35.      */
  36.     protected $tokenParameterName;
  37.     /**
  38.      * @var bool
  39.      */
  40.     protected $singleUse;
  41.     /**
  42.      * @var RefreshTokenGeneratorInterface
  43.      */
  44.     protected $refreshTokenGenerator;
  45.     /**
  46.      * @var ExtractorInterface
  47.      */
  48.     protected $extractor;
  49.     protected array $cookieSettings;
  50.     /**
  51.      * @param int    $ttl
  52.      * @param string $tokenParameterName
  53.      * @param bool   $singleUse
  54.      */
  55.     public function __construct(
  56.         RefreshTokenManagerInterface $refreshTokenManager,
  57.         $ttl,
  58.         RequestStack $requestStack,
  59.         $tokenParameterName,
  60.         $singleUse,
  61.         RefreshTokenGeneratorInterface $refreshTokenGenerator,
  62.         ExtractorInterface $extractor,
  63.         array $cookieSettings
  64.     ) {
  65.         $this->refreshTokenManager $refreshTokenManager;
  66.         $this->ttl $ttl;
  67.         $this->requestStack $requestStack;
  68.         $this->tokenParameterName $tokenParameterName;
  69.         $this->singleUse $singleUse;
  70.         $this->refreshTokenGenerator $refreshTokenGenerator;
  71.         $this->extractor $extractor;
  72.         $this->cookieSettings array_merge([
  73.             'enabled' => false,
  74.             'same_site' => 'lax',
  75.             'path' => '/',
  76.             'domain' => null,
  77.             'http_only' => true,
  78.             'secure' => true,
  79.             'remove_token_from_body' => true,
  80.         ], $cookieSettings);
  81.     }
  82.     public function attachRefreshToken(AuthenticationSuccessEvent $event): void
  83.     {
  84.         $user $event->getUser();
  85.         if (!$user instanceof UserInterface) {
  86.             return;
  87.         }
  88.         $data $event->getData();
  89.         $request $this->requestStack->getCurrentRequest();
  90.         if (null === $request) {
  91.             return;
  92.         }
  93.         // Extract refreshToken from the request
  94.         $refreshTokenString $this->extractor->getRefreshToken($request$this->tokenParameterName);
  95.         // Remove the current refreshToken if it is single-use
  96.         if ($refreshTokenString && true === $this->singleUse) {
  97.             $refreshToken $this->refreshTokenManager->get($refreshTokenString);
  98.             $refreshTokenString null;
  99.             if ($refreshToken instanceof RefreshTokenInterface) {
  100.                 $this->refreshTokenManager->delete($refreshToken);
  101.             }
  102.         }
  103.         // Set or create the refreshTokenString
  104.         if ($refreshTokenString) {
  105.             $data[$this->tokenParameterName] = $refreshTokenString;
  106.         } else {
  107.             $refreshToken $this->refreshTokenGenerator->createForUserWithTtl($user$this->ttl);
  108.             $this->refreshTokenManager->save($refreshToken);
  109.             $refreshTokenString $refreshToken->getRefreshToken();
  110.             $data[$this->tokenParameterName] = $refreshTokenString;
  111.         }
  112.         // Add a response cookie if enabled
  113.         if ($this->cookieSettings['enabled']) {
  114.             $event->getResponse()->headers->setCookie(
  115.                 new Cookie(
  116.                     $this->tokenParameterName,
  117.                     $refreshTokenString,
  118.                     time() + $this->ttl,
  119.                     $this->cookieSettings['path'],
  120.                     $this->cookieSettings['domain'],
  121.                     $this->cookieSettings['secure'],
  122.                     $this->cookieSettings['http_only'],
  123.                     false,
  124.                     $this->cookieSettings['same_site']
  125.                 )
  126.             );
  127.             // Remove the refreshTokenString from the response body
  128.             if (isset($this->cookieSettings['remove_token_from_body']) && $this->cookieSettings['remove_token_from_body']) {
  129.                 unset($data[$this->tokenParameterName]);
  130.             }
  131.         }
  132.         // Set response data
  133.         $event->setData($data);
  134.     }
  135. }