vendor/gesdinet/jwt-refresh-token-bundle/EventListener/LogoutEventListener.php line 50

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\RefreshTokenManagerInterface;
  12. use Gesdinet\JWTRefreshTokenBundle\Request\Extractor\ExtractorInterface;
  13. use Symfony\Component\HttpFoundation\JsonResponse;
  14. use Symfony\Component\Security\Http\Event\LogoutEvent;
  15. class LogoutEventListener
  16. {
  17.     private RefreshTokenManagerInterface $refreshTokenManager;
  18.     private ExtractorInterface $refreshTokenExtractor;
  19.     private string $tokenParameterName;
  20.     private array $cookieSettings;
  21.     private string $logout_firewall_context;
  22.     public function __construct(
  23.         RefreshTokenManagerInterface $refreshTokenManager,
  24.         ExtractorInterface $refreshTokenExtractor,
  25.         string $tokenParameterName,
  26.         array $cookieSettings,
  27.         string $logout_firewall_context
  28.     ) {
  29.         $this->refreshTokenManager $refreshTokenManager;
  30.         $this->refreshTokenExtractor $refreshTokenExtractor;
  31.         $this->tokenParameterName $tokenParameterName;
  32.         $this->cookieSettings array_merge([
  33.             'enabled' => false,
  34.             'same_site' => 'lax',
  35.             'path' => '/',
  36.             'domain' => null,
  37.             'http_only' => true,
  38.             'secure' => true,
  39.             'partitioned' => false,
  40.             'remove_token_from_body' => true,
  41.         ], $cookieSettings);
  42.         $this->logout_firewall_context $logout_firewall_context;
  43.     }
  44.     public function onLogout(LogoutEvent $event): void
  45.     {
  46.         $request $event->getRequest();
  47.         $current_firewall_context $request->attributes->get('_firewall_context');
  48.         if ($current_firewall_context !== $this->logout_firewall_context) {
  49.             return;
  50.         }
  51.         $tokenString $this->refreshTokenExtractor->getRefreshToken($request$this->tokenParameterName);
  52.         if (null === $tokenString) {
  53.             $event->setResponse(
  54.                 new JsonResponse(
  55.                     [
  56.                         'code' => 400,
  57.                         'message' => 'No refresh_token found.',
  58.                     ],
  59.                     JsonResponse::HTTP_BAD_REQUEST
  60.                 )
  61.             );
  62.             return;
  63.         } else {
  64.             $refreshToken $this->refreshTokenManager->get($tokenString);
  65.             if (null === $refreshToken) {
  66.                 $event->setResponse(
  67.                     new JsonResponse(
  68.                         [
  69.                             'code' => 200,
  70.                             'message' => 'The supplied refresh_token is already invalid.',
  71.                         ],
  72.                         JsonResponse::HTTP_OK
  73.                     )
  74.                 );
  75.             } else {
  76.                 $this->refreshTokenManager->delete($refreshToken);
  77.                 $event->setResponse(
  78.                     new JsonResponse(
  79.                         [
  80.                             'code' => 200,
  81.                             'message' => 'The supplied refresh_token has been invalidated.',
  82.                         ],
  83.                         JsonResponse::HTTP_OK
  84.                     )
  85.                 );
  86.             }
  87.         }
  88.         if ($this->cookieSettings['enabled']) {
  89.             $response $event->getResponse();
  90.             $response->headers->clearCookie(
  91.                 $this->tokenParameterName,
  92.                 $this->cookieSettings['path'],
  93.                 $this->cookieSettings['domain'],
  94.                 $this->cookieSettings['secure'],
  95.                 $this->cookieSettings['http_only'],
  96.                 $this->cookieSettings['same_site']
  97.             );
  98.         }
  99.     }
  100. }