src/EventSubscriber/SilentAuthenticationSubscriber.php line 22

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\HttpClient\HttpClient;
  5. use Symfony\Component\HttpKernel\Event\RequestEvent;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  8. class SilentAuthenticationSubscriber implements EventSubscriberInterface
  9. {
  10.     public function __construct(private TokenStorageInterface $token)
  11.     {
  12.     }
  13.     public function onKernelRequest(RequestEvent $event)
  14.     {
  15.         $request $event->getRequest();
  16.         $session $request->getSession();
  17.         $accessToken $session->get('access_token');
  18.         $unauthentified $session->get('unauthentified');
  19.         // verification user=bot pour contournement de l'erreur 302
  20.         $userAgent $_SERVER['HTTP_USER_AGENT'] ?? '';
  21.         $isBot preg_match('/(googlebot|bingbot|slurp|duckduckbot|baiduspider|yandexbot|facebot|twitterbot)/i'$userAgent);
  22.         if ($isBot) {
  23.             return;
  24.         }
  25.         if ($request->getHost() == 'serviceslenord.spontaneit.fr' || $request->getHost() == 'services.lenord.fr') {
  26.             //return;
  27.             $httpClient HttpClient::create();
  28.             $keycloakUrl $_ENV['KEYCLOAK_BASE'];
  29.             try {
  30.                 $response $httpClient->request('GET'$keycloakUrl);
  31.                 $statusCode $response->getStatusCode();
  32.                 if ($statusCode !== 200) {
  33.                     return;
  34.                 } else {
  35.                     $content $response->getContent();
  36.                     $jsonData json_decode($contenttrue);
  37.                     if (!isset($jsonData['realm'])) {
  38.                         return;
  39.                     }
  40.                 }
  41.             } catch (\Exception $exception) {
  42.                 return;
  43.             }
  44.             // Silent Authenticator
  45.             if (isset($accessToken) && $accessToken->hasExpired() && !isset($unauthentified) || !isset($accessToken) && !isset($unauthentified)) {
  46.                 $targetUrl $request->getBaseUrl() . '/connect/oauth/silent';
  47.                 if (!str_contains($request->getPathInfo(), 'oauth')) {
  48.                     $current_url $request->getUri();
  49.                     $session->set('path'$current_url);
  50.                     //$session->set('path', $request->attributes->get('_route'));
  51.                     $session->remove('unauthentified');
  52.                     $redirectUrl = new RedirectResponse($targetUrl);
  53.                     $event->setResponse($redirectUrl);
  54.                 }
  55.             }
  56.         }
  57.     }
  58.     public static function getSubscribedEvents(): array
  59.     {
  60.         return [
  61.             'kernel.request' => 'onKernelRequest',
  62.         ];
  63.     }
  64. }