src/EventListener/AuthenticationSuccessListener.php line 21

Open in your IDE?
  1. <?php
  2. // src/EventListener/AuthenticationSuccessListener.php
  3. namespace App\EventListener;
  4. use Lexik\Bundle\JWTAuthenticationBundle\Event\AuthenticationSuccessEvent;
  5. use Gesdinet\JWTRefreshTokenBundle\Model\RefreshTokenManagerInterface;
  6. use Symfony\Component\Security\Core\User\UserInterface;
  7. class AuthenticationSuccessListener
  8. {
  9.     private RefreshTokenManagerInterface $refreshTokenManager;
  10.     private int $ttl;
  11.     public function __construct(RefreshTokenManagerInterface $refreshTokenManagerint $ttl)
  12.     {
  13.         $this->refreshTokenManager $refreshTokenManager;
  14.         $this->ttl $ttl;
  15.     }
  16.     public function onAuthenticationSuccess(AuthenticationSuccessEvent $event): void
  17.     {
  18.         $user $event->getUser();
  19.         if (!$user instanceof UserInterface) {
  20.             error_log("ERREUR: L'utilisateur n'est pas une instance de UserInterface");
  21.             return;
  22.         }
  23.         try {
  24.             // Récupérer l'email
  25.             $email $this->getUserEmail($user);
  26.             if (empty($email)) {
  27.                 throw new \RuntimeException("Impossible de récupérer l'email de l'utilisateur");
  28.             }
  29.             error_log("AuthenticationSuccessListener: Email utilisé = " $email);
  30.             // Créer le refresh token
  31.             $refreshToken $this->refreshTokenManager->create();
  32.             $refreshToken->setUsername($email);
  33.             $refreshToken->setRefreshToken();
  34.             $refreshToken->setValid((new \DateTime())->modify('+' $this->ttl ' seconds'));
  35.             error_log("AuthenticationSuccessListener: Refresh token créé");
  36.             $this->refreshTokenManager->save($refreshToken);
  37.             error_log("AuthenticationSuccessListener: Refresh token sauvegardé");
  38.             // Ajouter le refresh token à la réponse
  39.             $data $event->getData();
  40.             $data['success'] = true;
  41.             $data['refresh_token'] = $refreshToken->getRefreshToken();
  42.             $event->setData($data);
  43.         } catch (\Exception $e) {
  44.             error_log("ERREUR AuthenticationSuccessListener: " $e->getMessage());
  45.             // En cas d'erreur, on retourne quand même le JWT mais sans refresh token
  46.             $data $event->getData();
  47.             $data['success'] = true;
  48.             $data['warning'] = 'Connexion réussie mais le refresh token n\'a pas pu être créé';
  49.             $event->setData($data);
  50.         }
  51.     }
  52.     private function getUserEmail(UserInterface $user): ?string
  53.     {
  54.         if (method_exists($user'getUserIdentifier')) {
  55.             return $user->getUserIdentifier();
  56.         }
  57.         if (method_exists($user'getEmail')) {
  58.             return $user->getEmail();
  59.         }
  60.         if (method_exists($user'getUsername')) {
  61.             return $user->getUsername();
  62.         }
  63.         return null;
  64.     }
  65. }