src/Security/AuthTokenAuthenticator.php line 128

  1. <?php
  2. namespace App\Security;
  3. use Symfony\Component\HttpFoundation\Request;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\HttpFoundation\JsonResponse;
  6. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  7. use Symfony\Component\Security\Core\Exception\BadCredentialsException;
  8. use Symfony\Component\Security\Core\User\UserInterface;
  9. use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
  10. use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
  11. use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport;
  12. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
  13. use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
  14. use Symfony\Component\Security\Http\HttpUtils;
  15. class AuthTokenAuthenticator extends AbstractAuthenticator
  16. {
  17.     /**
  18.      * Duree de validite du token en secondes, 12 heures
  19.      */
  20.     private const TOKEN_VALIDITY_DURATION 12 3600;
  21.     private HttpUtils $httpUtils;
  22.     private AuthTokenUserProvider $userProvider;
  23.     public function __construct(HttpUtils $httpUtilsAuthTokenUserProvider $userProvider)
  24.     {
  25.         $this->httpUtils $httpUtils;
  26.         $this->userProvider $userProvider;
  27.     }
  28.     public function supports(Request $request): bool
  29.     {
  30.         $targetUrl '/auth-tokens';
  31.         $targetUrl1 '/logo';
  32.         $targetUrl2 '/suivitOuvertureMailling';
  33.         $targetUrl3 '/cp';
  34.         $targetUrl4 '/conge';
  35.         $targetUrl5 '/pdf';
  36.         $targetUrl6 '/update/pressroom';
  37.         $targetUrl7 '/image/pressroom';
  38.         $targetUrl8 '/maillings/information';
  39.         $targetUrl9 '/demande/contact';
  40.         $targetUrl10 '/communique/site';
  41.         $targetUrl11 '/desabonner';
  42.         $targetUrl12 '/api/article_sites';
  43.         $targetUrl13 '/image/site';
  44.         $targetUrl14 '/maillings/getNbEnvoyer';
  45.         $targetUrl15 '/api/article_sites';
  46.         $targetUrl16 '/api/mot_cle_sites';
  47.         $targetUrl17 '/cp/client/intranet';
  48.         $targetUrl18 '/api/statistique/clients/agence';
  49.         $targetUrl19 '/mailing/contactsenvoireel';
  50.         if ($request->getMethod() === 'POST' && $this->httpUtils->checkRequestPath($request$targetUrl)) {
  51.             return false;
  52.         }
  53.         if ($request->getMethod() === 'GET' && stripos($request->getPathInfo(), $targetUrl1) === 0) {
  54.             return false;
  55.         }
  56.         if ($request->getMethod() === 'GET' && stripos($request->getPathInfo(), $targetUrl3) === 0) {
  57.             return false;
  58.         }
  59.         if ($request->getMethod() === 'POST' && $this->httpUtils->checkRequestPath($request$targetUrl2)) {
  60.             return false;
  61.         }
  62.         if ($request->getMethod() === 'GET' && stripos($request->getPathInfo(), $targetUrl4) === 0) {
  63.             return false;
  64.         }
  65.         if ($request->getMethod() === 'POST' && stripos($request->getPathInfo(), $targetUrl5) === 0) {
  66.             return false;
  67.         }
  68.         if ($request->getMethod() === 'GET' && stripos($request->getPathInfo(), $targetUrl6) === 0) {
  69.             return false;
  70.         }
  71.         if ($request->getMethod() === 'POST' && stripos($request->getPathInfo(), $targetUrl6) === 0) {
  72.             return false;
  73.         }
  74.         if ($request->getMethod() === 'GET' && stripos($request->getPathInfo(), $targetUrl7) === 0) {
  75.             return false;
  76.         }
  77.         if ($request->getMethod() === 'GET' && stripos($request->getPathInfo(), $targetUrl8) === 0) {
  78.             return false;
  79.         }
  80.         if ($request->getMethod() === 'GET' && stripos($request->getPathInfo(), $targetUrl10) === 0) {
  81.             return false;
  82.         }
  83.         if ($request->getMethod() === 'POST' && stripos($request->getPathInfo(), $targetUrl9) === 0) {
  84.             return false;
  85.         }
  86.         if ($request->getMethod() === 'GET' && stripos($request->getPathInfo(), $targetUrl11) === 0) {
  87.             return false;
  88.         }
  89.         if ($request->getMethod() === 'GET' && stripos($request->getPathInfo(), $targetUrl12) === 0) {
  90.             return false;
  91.         }
  92.         if ($request->getMethod() === 'GET' && stripos($request->getPathInfo(), $targetUrl13) === 0) {
  93.             return false;
  94.         }
  95.         if ($request->getMethod() === 'GET' && stripos($request->getPathInfo(), $targetUrl14) === 0) {
  96.             return false;
  97.         }
  98.         if ($request->getMethod() === 'GET' && stripos($request->getPathInfo(), $targetUrl15) === 0) {
  99.             return false;
  100.         }
  101.         if ($request->getMethod() === 'GET' && stripos($request->getPathInfo(), $targetUrl16) === 0) {
  102.             return false;
  103.         }
  104.         if ($request->getMethod() === 'GET' && stripos($request->getPathInfo(), $targetUrl17) === 0) {
  105.             return false;
  106.         }
  107.         if ($request->getMethod() === 'GET' && stripos($request->getPathInfo(), $targetUrl18) === 0) {
  108.             return false;
  109.         }
  110.         if ($request->getMethod() === 'GET' && stripos($request->getPathInfo(), $targetUrl19) === 0) {
  111.             return false;
  112.         }
  113.         return true;
  114.     }
  115.     public function authenticate(Request $request): Passport
  116.     {
  117.         $authTokenHeader $request->headers->get('X-Auth-Token');
  118.         if (!$authTokenHeader) {
  119.             throw new BadCredentialsException('X-Auth-Token header is required');
  120.         }
  121.         return new SelfValidatingPassport(
  122.             new UserBadge($authTokenHeader, function (string $credentials): UserInterface {
  123.                 $authToken $this->userProvider->getAuthToken($credentials);
  124.                 if (!$authToken || !$this->isTokenValid($authToken)) {
  125.                     throw new CustomUserMessageAuthenticationException('Invalid authentication token');
  126.                 }
  127.                 return $authToken->getAuthUser();
  128.             })
  129.         );
  130.     }
  131.     /**
  132.      * Verifie la validite du token
  133.      */
  134.     public function isTokenValid($authToken): bool
  135.     {
  136.         return (time() - $authToken->getCreatedAt()->getTimestamp()) < self::TOKEN_VALIDITY_DURATION;
  137.     }
  138.     public function onAuthenticationFailure(Request $requestAuthenticationException $exception): ?Response
  139.     {
  140.         throw $exception;
  141.     }
  142.     public function onAuthenticationSuccess(Request $request$tokenstring $providerKey): ?Response {
  143.         return null;
  144.     }
  145.     public function start(Request $requestAuthenticationException $authException null): Response
  146.     {
  147.         return new JsonResponse([
  148.             'message' => 'Authentication Required',
  149.         ], Response::HTTP_UNAUTHORIZED);
  150.     }
  151. }