<?phpnamespace App\Security;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;use Symfony\Component\Security\Core\Exception\AuthenticationException;use Symfony\Component\Security\Core\User\UserProviderInterface;use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;use Symfony\Component\Security\Http\Authenticator\Passport\Passport;use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport;use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTTokenManagerInterface;class JWTTokenAuthenticator extends AbstractAuthenticator{ private $jwtManager; private $userProvider; public function __construct(JWTTokenManagerInterface $jwtManager, UserProviderInterface $userProvider ) { $this->jwtManager = $jwtManager; $this->userProvider = $userProvider; } public function supports(Request $request): ?bool { return $request->headers->has('Authorization'); } public function authenticate(Request $request): Passport { $authHeader = $request->headers->get('Authorization'); if (!$authHeader || 0 !== strpos($authHeader, 'Bearer ')) { throw new AuthenticationException('No JWT token found'); } $token = substr($authHeader, 7); $data = $this->jwtManager->parse($token); return new SelfValidatingPassport( new UserBadge($data['email'], function ($userIdentifier) { return $this->userProvider->loadUserByUsername($userIdentifier); }) ); } public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response { return null; // continue the request } public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response { return new Response("Authentication Failed", Response::HTTP_UNAUTHORIZED); }}