src/Subscriber/PunchoutCookiePolicySubscriber.php line 35

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Subscriber;
  4. use App\Store\StoreContext;
  5. use Psr\Log\LoggerInterface;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9. /**
  10. * @see config/packages/framework.yaml
  11. */
  12. class PunchoutCookiePolicySubscriber implements EventSubscriberInterface
  13. {
  14. private StoreContext $storeContext;
  15. private LoggerInterface $logger;
  16. public function __construct(StoreContext $storeContext, LoggerInterface $logger)
  17. {
  18. $this->storeContext = $storeContext;
  19. $this->logger = $logger;
  20. }
  21. public static function getSubscribedEvents(): array
  22. {
  23. // run after Symfony\Component\HttpKernel\EventListener\SessionListener::onKernelResponse()
  24. return [KernelEvents::RESPONSE => ['onKernelResponse', -1001]];
  25. }
  26. /**
  27. * Change cookie samesite=lax to samesite=none for punchout store requests
  28. */
  29. public function onKernelResponse(ResponseEvent $event): void
  30. {
  31. if (!$this->storeContext->isPunchoutStore()) {
  32. return;
  33. }
  34. $response = $event->getResponse();
  35. $cookieList = $response->headers->getCookies();
  36. foreach ($cookieList as $cookie) {
  37. $name = $cookie->getName();
  38. if ($name !== 'PHPSESSID') {
  39. continue;
  40. }
  41. $updatedCookie = $cookie->withSameSite('none');
  42. $response->headers->setCookie($updatedCookie);
  43. if (!$event->getRequest()->isSecure()) {
  44. $this->logger->error('Cookie PHPSESSID is ignored by browser, due to browser security with settings samesite=none and non-https connection.');
  45. }
  46. }
  47. }
  48. }