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

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\Model\RefreshTokenInterface;
  12. use Gesdinet\JWTRefreshTokenBundle\Model\RefreshTokenManagerInterface;
  13. use Gesdinet\JWTRefreshTokenBundle\Request\RequestRefreshToken;
  14. use Lexik\Bundle\JWTAuthenticationBundle\Event\AuthenticationSuccessEvent;
  15. use Symfony\Component\Security\Core\User\UserInterface;
  16. use Symfony\Component\Validator\Validator\ValidatorInterface;
  17. use Symfony\Component\HttpFoundation\RequestStack;
  18. use Symfony\Component\PropertyAccess\PropertyAccessor;
  19. class AttachRefreshTokenOnSuccessListener
  20. {
  21.     /**
  22.      * @var RefreshTokenManagerInterface
  23.      */
  24.     protected $refreshTokenManager;
  25.     /**
  26.      * @var int
  27.      */
  28.     protected $ttl;
  29.     /**
  30.      * @var ValidatorInterface
  31.      */
  32.     protected $validator;
  33.     /**
  34.      * @var RequestStack
  35.      */
  36.     protected $requestStack;
  37.     /**
  38.      * @var string
  39.      */
  40.     protected $userIdentityField;
  41.     /**
  42.      * @var string
  43.      */
  44.     protected $tokenParameterName;
  45.     /**
  46.      * @var bool
  47.      */
  48.     protected $singleUse;
  49.     /**
  50.      * AttachRefreshTokenOnSuccessListener constructor.
  51.      *
  52.      * @param RefreshTokenManagerInterface $refreshTokenManager
  53.      * @param int                          $ttl
  54.      * @param ValidatorInterface           $validator
  55.      * @param RequestStack                 $requestStack
  56.      * @param string                       $userIdentityField
  57.      * @param string                       $tokenParameterName
  58.      * @param bool                         $singleUse
  59.      */
  60.     public function __construct(
  61.         RefreshTokenManagerInterface $refreshTokenManager,
  62.         $ttl,
  63.         ValidatorInterface $validator,
  64.         RequestStack $requestStack,
  65.         $userIdentityField,
  66.         $tokenParameterName,
  67.         $singleUse
  68.     ) {
  69.         $this->refreshTokenManager $refreshTokenManager;
  70.         $this->ttl $ttl;
  71.         $this->validator $validator;
  72.         $this->requestStack $requestStack;
  73.         $this->userIdentityField $userIdentityField;
  74.         $this->tokenParameterName $tokenParameterName;
  75.         $this->singleUse $singleUse;
  76.     }
  77.     public function attachRefreshToken(AuthenticationSuccessEvent $event)
  78.     {
  79.         $data $event->getData();
  80.         $user $event->getUser();
  81.         $request $this->requestStack->getCurrentRequest();
  82.         if (!$user instanceof UserInterface) {
  83.             return;
  84.         }
  85.         $refreshTokenString RequestRefreshToken::getRefreshToken($request$this->tokenParameterName);
  86.         if ($refreshTokenString && true === $this->singleUse) {
  87.             $refreshToken $this->refreshTokenManager->get($refreshTokenString);
  88.             $refreshTokenString null;
  89.             if ($refreshToken instanceof RefreshTokenInterface) {
  90.                 $this->refreshTokenManager->delete($refreshToken);
  91.             }
  92.         }
  93.         if ($refreshTokenString) {
  94.             $data[$this->tokenParameterName] = $refreshTokenString;
  95.         } else {
  96.             $datetime = new \DateTime();
  97.             $datetime->modify('+'.$this->ttl.' seconds');
  98.             $refreshToken $this->refreshTokenManager->create();
  99.             $accessor = new PropertyAccessor();
  100.             $userIdentityFieldValue $accessor->getValue($user$this->userIdentityField);
  101.             $refreshToken->setUsername($userIdentityFieldValue);
  102.             $refreshToken->setRefreshToken();
  103.             $refreshToken->setValid($datetime);
  104.             $valid false;
  105.             while (false === $valid) {
  106.                 $valid true;
  107.                 $errors $this->validator->validate($refreshToken);
  108.                 if ($errors->count() > 0) {
  109.                     foreach ($errors as $error) {
  110.                         if ('refreshToken' === $error->getPropertyPath()) {
  111.                             $valid false;
  112.                             $refreshToken->setRefreshToken();
  113.                         }
  114.                     }
  115.                 }
  116.             }
  117.             $this->refreshTokenManager->save($refreshToken);
  118.             $data[$this->tokenParameterName] = $refreshToken->getRefreshToken();
  119.         }
  120.         $event->setData($data);
  121.     }
  122. }