src/EventListener/JWTCreatedListener.php line 98

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Util\EsUtil;
  4. use App\Service\EsCache;
  5. use App\Entity\Container;
  6. use App\Handler\AccessTokenHandler;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. use Lexik\Bundle\JWTAuthenticationBundle\Event\JWTCreatedEvent;
  10. use Lexik\Bundle\JWTAuthenticationBundle\Event\JWTDecodedEvent;
  11. use Lexik\Bundle\JWTAuthenticationBundle\Event\JWTEncodedEvent;
  12. use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTTokenManagerInterface;
  13. class JWTCreatedListener
  14. {
  15.     private $requestStack;
  16.     private $esCache;
  17.     private $accessTokenHandler;
  18.     private $_em;
  19.     public function __construct(RequestStack $requestStackEsCache $esCacheAccessTokenHandler $accessTokenHandlerEntityManagerInterface $_em)
  20.     {
  21.         $this->requestStack $requestStack;
  22.         $this->esCache $esCache;
  23.         $this->accessTokenHandler $accessTokenHandler;
  24.         $this->_em $_em;
  25.     }
  26.     /**
  27.      * @param JWTCreatedEvent $event
  28.      *
  29.      * @return void
  30.      */
  31.     public function onJWTCreated(JWTCreatedEvent $event)
  32.     {
  33.         $request $this->requestStack->getCurrentRequest();
  34.         $payload $event->getData();
  35.         if (PHP_SAPI === 'cli' && isset($GLOBALS['container'])) {
  36.             $redirectContainerId $GLOBALS['container']->getId();
  37.             $payload['cid'] = $GLOBALS['container']->getClient()->getId();
  38.             $payload['ip'] = 'EXPERTSHARE';
  39.         } else {
  40.             $redirectContainerId $request->attributes->get('redirectContainerId'false);
  41.             $payload['ip'] = $request->getClientIp();
  42.             $client $this->esCache->getClient();
  43.             if ($client) {
  44.                 $payload['cid'] = $client->getId();
  45.             }
  46.         }
  47.         if ($redirectContainerId) {
  48.             $payload['cntid'] = (int)$redirectContainerId;
  49.         } else {
  50.             $container $this->esCache->getContainer();
  51.             if ($container) {
  52.                 $payload['cntid'] = (int)$container->getId();
  53.             }
  54.         }
  55.         $event->setData($payload);
  56.     }
  57.     /**
  58.      * @param JWTEncodedEvent $event
  59.      */
  60.     public function onJwtEncoded(JWTEncodedEvent $event)
  61.     {
  62.         $prevRefreshToken null;
  63.         if (PHP_SAPI === 'cli' && isset($GLOBALS['container'])) {
  64.             $redirectContainerId $GLOBALS['container']->getId();
  65.         } else {
  66.             $request $this->requestStack->getCurrentRequest();
  67.             $redirectContainerId $request->attributes->get('redirectContainerId'false);
  68.             $prevRefreshToken $request->headers->get('ES-REFRESH-TOKEN'null);
  69.         }
  70.         $token $event->getJWTString();
  71.         $container null;
  72.         if ($redirectContainerId) {
  73.             $container $this->_em->getRepository(Container::class)->find($redirectContainerId);
  74.         }
  75.         $this->accessTokenHandler->create($tokennull$container$prevRefreshToken);
  76.     }
  77.     /**
  78.      * @param JWTDecodedEvent $event
  79.      *
  80.      * @return void
  81.      */
  82.     public function onJWTDecoded(JWTDecodedEvent $event)
  83.     {
  84.         $request $this->requestStack->getCurrentRequest();
  85.         $payload $event->getPayload();
  86.         $container $this->esCache->getContainer();
  87.         $token substr($request->headers->get('Authorization'), 7);
  88.         if (!$this->accessTokenHandler->isValid($token) || $container->getId() !== $payload['cntid']) {
  89.             $event->markAsInvalid();
  90.         }
  91.         // $tokenDetails = EsUtil::decodeJWTPayloadOnly($token);
  92.         // $iat = new \DateTime();
  93.         // $iat->setTimestamp(($tokenDetails['iat'] + 60 * 60));
  94.         // $exp = new \DateTime();
  95.         // $exp->setTimestamp($tokenDetails['exp']);
  96.         // $ct = new \DateTime();
  97.         // if ($iat < $ct) {
  98.         //     //if (!isset($payload['ip']) || ($payload['ip'] !== $request->getClientIp() && $payload['ip'] !== 'EXPERTSHARE') || $container->getId() !== $payload['cntid']) {
  99.         //     if (!$this->accessTokenHandler->isValid($token) || $container->getId() !== $payload['cntid']) {
  100.         //         $event->markAsInvalid();
  101.         //     }
  102.         // } else {
  103.         //     if ($exp < $ct || $container->getId() !== $payload['cntid']) {
  104.         //         $event->markAsInvalid();
  105.         //     }
  106.         // }
  107.     }
  108. }