src/EventListener/JWTCreatedListener.php line 26

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Entity\User;
  4. use Lexik\Bundle\JWTAuthenticationBundle\Event\AuthenticationSuccessEvent;
  5. use Scheb\TwoFactorBundle\Security\TwoFactor\Provider\Google\GoogleAuthenticator;
  6. use Symfony\Component\HttpFoundation\RequestStack;
  7. readonly class JWTCreatedListener
  8. {
  9.     /**
  10.      * @param RequestStack $requestStack
  11.      * @param GoogleAuthenticator $googleAuthenticator
  12.      */
  13.     public function __construct(
  14.         private RequestStack $requestStack,
  15.         private GoogleAuthenticator $googleAuthenticator
  16.     )
  17.     {
  18.     }
  19.     /**
  20.      * @param AuthenticationSuccessEvent $event
  21.      */
  22.     public function onAuthenticationSuccessResponse(AuthenticationSuccessEvent $event): void
  23.     {
  24.         $data $event->getData();
  25.         $user $event->getUser();
  26.         if (!$user instanceof User) {
  27.             return;
  28.         }
  29.         $data['roles'] = $user->getRoles();
  30.         try {
  31.             if($user->getIsEnabled2FA()) {
  32.                 $payload json_decode(
  33.                     $this->requestStack->getMainRequest()?->getContent(),
  34.                     true,
  35.                     512,
  36.                     JSON_THROW_ON_ERROR
  37.                 );
  38.                 if (isset($payload['code'])) {
  39.                     if (!$this->googleAuthenticator->checkCode($user$payload['code'])) {
  40.                         unset(
  41.                             $data['token']
  42.                         );
  43.                         $data['code'] = $payload['code'];
  44.                         $data['error'] = sprintf('This code %s is not correct !',$payload['code']);
  45.                         $event->getResponse()->setStatusCode($event->getResponse()::HTTP_UNAUTHORIZED);
  46.                         $event->stopPropagation();
  47.                     }
  48.                 }
  49.                 else {
  50.                     unset(
  51.                         $data['token']
  52.                     );
  53.                     $event->getResponse()->setStatusCode($event->getResponse()::HTTP_MULTIPLE_CHOICES);
  54.                     $event->stopPropagation();
  55.                 }
  56.             }
  57.         } catch (\Exception $e){
  58.         }
  59.         $event->setData($data);
  60.     }
  61. }