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

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.             'remove_token_from_body' => true,
  40.         ], $cookieSettings);
  41.         $this->logout_firewall_context $logout_firewall_context;
  42.     }
  43.     public function onLogout(LogoutEvent $event): void
  44.     {
  45.         $request $event->getRequest();
  46.         $current_firewall_context $request->attributes->get('_firewall_context');
  47.         if ($current_firewall_context !== $this->logout_firewall_context) {
  48.             return;
  49.         }
  50.         $tokenString $this->refreshTokenExtractor->getRefreshToken($request$this->tokenParameterName);
  51.         if (null === $tokenString) {
  52.             $event->setResponse(
  53.                 new JsonResponse(
  54.                     [
  55.                         'code' => 400,
  56.                         'message' => 'No refresh_token found.',
  57.                     ],
  58.                     JsonResponse::HTTP_BAD_REQUEST
  59.                 )
  60.             );
  61.             return;
  62.         } else {
  63.             $refreshToken $this->refreshTokenManager->get($tokenString);
  64.             if (null === $refreshToken) {
  65.                 $event->setResponse(
  66.                     new JsonResponse(
  67.                         [
  68.                             'code' => 200,
  69.                             'message' => 'The supplied refresh_token is already invalid.',
  70.                         ],
  71.                         JsonResponse::HTTP_OK
  72.                     )
  73.                 );
  74.             } else {
  75.                 $this->refreshTokenManager->delete($refreshToken);
  76.                 $event->setResponse(
  77.                     new JsonResponse(
  78.                         [
  79.                             'code' => 200,
  80.                             'message' => 'The supplied refresh_token has been invalidated.',
  81.                         ],
  82.                         JsonResponse::HTTP_OK
  83.                     )
  84.                 );
  85.             }
  86.         }
  87.         if ($this->cookieSettings['enabled']) {
  88.             $response $event->getResponse();
  89.             $response->headers->clearCookie(
  90.                 $this->tokenParameterName,
  91.                 $this->cookieSettings['path'],
  92.                 $this->cookieSettings['domain'],
  93.                 $this->cookieSettings['secure'],
  94.                 $this->cookieSettings['http_only'],
  95.                 $this->cookieSettings['same_site']
  96.             );
  97.         }
  98.     }
  99. }