src/EventListener/RefreshTokenListener.php line 40

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventListener;
  4. use App\Entity\Security\RefreshToken;
  5. use App\Processor\Orm\RemoveEntityProcessor;
  6. use App\Service\Slack\SlackService;
  7. use App\Service\Slack\SlackServiceInterface;
  8. use Doctrine\ORM\EntityManagerInterface;
  9. use Gesdinet\JWTRefreshTokenBundle\Event\RefreshAuthenticationFailureEvent;
  10. use Gesdinet\JWTRefreshTokenBundle\Security\Exception\TokenNotFoundException;
  11. use Psr\Log\LoggerInterface;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\RequestStack;
  15. class RefreshTokenListener implements EventSubscriberInterface
  16. {
  17.     private ?Request $request;
  18.     public function __construct(
  19.         private EntityManagerInterface $entityManager,
  20.         private RequestStack $requestStack,
  21.         private LoggerInterface $channelLoginLogger,
  22.         private SlackService $slackService,
  23.         private RemoveEntityProcessor $removeEntityProcessor,
  24.     ) {
  25.         $this->request $this->requestStack->getCurrentRequest();
  26.     }
  27.     public static function getSubscribedEvents()
  28.     {
  29.         return [
  30.             'gesdinet.refresh_token_failure' => 'onRefreshTokenFailure',
  31.         ];
  32.     }
  33.     public function onRefreshTokenFailure(RefreshAuthenticationFailureEvent $event): void
  34.     {
  35.         if (true !== $event->getException() instanceof TokenNotFoundException) {
  36.             return;
  37.         }
  38.         $data json_decode($this->request->getContent() ?? ''true);
  39.         $refreshToken $data['refresh_token'] ?? null;
  40.         if (null === $refreshToken) {
  41.             return;
  42.         }
  43.         $this->channelLoginLogger->info('Login using refresh token failed : ', [
  44.             'user-agent' => $this->request->headers->get('user-agent'),
  45.             'source' => $this->request->headers->get('source'),
  46.             'ip' => $this->request->getClientIp(),
  47.             'refreshToken' => $refreshToken,
  48.         ]);
  49.         $this->removeEntityProcessor->disableSoftDeleteFilter();
  50.         $repository $this->entityManager->getRepository(RefreshToken::class);
  51.         $refreshTokenObject $repository->findOneByRefreshToken($refreshToken);
  52.         if (null === $refreshTokenObject) {
  53.             return;
  54.         }
  55.         $userName $refreshTokenObject->getUsername();
  56.         $this->channelLoginLogger->info('Deleting all refresh tokens related to user : ', ['userName' => $userName]);
  57.         $this->entityManager->createQuery('DELETE FROM App\Entity\Security\RefreshToken rt WHERE rt.username = :username')
  58.             ->setParameter('username'$userName)
  59.             ->execute()
  60.         ;
  61.         $this->slackService->sendMessage(SlackServiceInterface::BUG_REPORTS_CHANNEL"Token refresh failed for user {$userName} : with token : {$refreshToken}");
  62.         $this->removeEntityProcessor->enableSoftDeleteFilter();
  63.     }
  64. }