<?php
namespace App\EventSubscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpClient\HttpClient;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class SilentAuthenticationSubscriber implements EventSubscriberInterface
{
public function __construct(private TokenStorageInterface $token)
{
}
public function onKernelRequest(RequestEvent $event)
{
$request = $event->getRequest();
$session = $request->getSession();
$accessToken = $session->get('access_token');
$unauthentified = $session->get('unauthentified');
// verification user=bot pour contournement de l'erreur 302
$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? '';
$isBot = preg_match('/(googlebot|bingbot|slurp|duckduckbot|baiduspider|yandexbot|facebot|twitterbot)/i', $userAgent);
if ($isBot) {
return;
}
if ($request->getHost() == 'serviceslenord.spontaneit.fr' || $request->getHost() == 'services.lenord.fr') {
//return;
$httpClient = HttpClient::create();
$keycloakUrl = $_ENV['KEYCLOAK_BASE'];
try {
$response = $httpClient->request('GET', $keycloakUrl);
$statusCode = $response->getStatusCode();
if ($statusCode !== 200) {
return;
} else {
$content = $response->getContent();
$jsonData = json_decode($content, true);
if (!isset($jsonData['realm'])) {
return;
}
}
} catch (\Exception $exception) {
return;
}
// Silent Authenticator
if (isset($accessToken) && $accessToken->hasExpired() && !isset($unauthentified) || !isset($accessToken) && !isset($unauthentified)) {
$targetUrl = $request->getBaseUrl() . '/connect/oauth/silent';
if (!str_contains($request->getPathInfo(), 'oauth')) {
$current_url = $request->getUri();
$session->set('path', $current_url);
//$session->set('path', $request->attributes->get('_route'));
$session->remove('unauthentified');
$redirectUrl = new RedirectResponse($targetUrl);
$event->setResponse($redirectUrl);
}
}
}
}
public static function getSubscribedEvents(): array
{
return [
'kernel.request' => 'onKernelRequest',
];
}
}