src/Security/ApiKeyAuthenticator.php line 62

  1. <?php
  2. namespace App\Security;
  3. use App\Entity\User;
  4. use App\Security\Providers\UserProvider;
  5. use Symfony\Component\HttpFoundation\JsonResponse;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  9. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  10. use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
  11. use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
  12. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
  13. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\PreAuthenticatedUserBadge;
  14. use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
  15. use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport;
  16. use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
  17. use League\OAuth2\Server\CryptKey;
  18. use League\OAuth2\Server\CryptTrait;
  19. use League\OAuth2\Server\Exception\OAuthServerException;
  20. use League\OAuth2\Server\Repositories\AccessTokenRepositoryInterface;
  21. use DateTimeZone;
  22. use Lcobucci\Clock\SystemClock;
  23. use Lcobucci\JWT\Configuration;
  24. use Lcobucci\JWT\Signer\Key\InMemory;
  25. use Lcobucci\JWT\Signer\Rsa\Sha256;
  26. use Lcobucci\JWT\Validation\Constraint\SignedWith;
  27. use Lcobucci\JWT\Validation\Constraint\StrictValidAt;
  28. use Lcobucci\JWT\Validation\Constraint\ValidAt;
  29. use Lcobucci\JWT\Validation\RequiredConstraintsViolated;
  30. use Psr\Http\Message\ServerRequestInterface;
  31. use Symfony\Component\HttpFoundation\RequestStack;
  32. use Symfony\Component\HttpFoundation\Session\Session;
  33. class ApiKeyAuthenticator extends AbstractAuthenticator
  34. {
  35.     use CryptTrait;
  36.     public const PREFIX 'Bearer ';
  37.     private UserProvider $userProvider;
  38.     /** @var RequestStack */
  39.     private RequestStack $requestStack;
  40.     /** @var ?string */
  41.     protected $accessToken;
  42.     /**
  43.      * @param AccessTokenRepositoryInterface $accessTokenRepository
  44.      * @param RequestStack $requestStack
  45.      * @param UserProvider $userProvider
  46.      *
  47.      */
  48.     public function __construct(AccessTokenRepositoryInterface $accessTokenRepositoryRequestStack $requestStackUserProvider $userProvider)
  49.     {
  50.         $this->requestStack $requestStack;
  51.         $this->userProvider $userProvider;
  52.         /** @var Session $session */
  53.         $session $this->requestStack->getSession();
  54.         $this->accessToken $session->get('accessToken');
  55.     }
  56.     public function supports(Request $request): ?bool
  57.     {
  58.         return null !== $this->accessToken;
  59.     }
  60.     public function authenticate(Request $request): Passport
  61.     {
  62.         /** @var Session $session */
  63.         $session $this->requestStack->getSession();
  64.         $accessToken $session->get('accessToken');
  65.         return new SelfValidatingPassport(
  66.             new UserBadge($accessToken, function () use ($accessToken) {
  67.                 return $this->userProvider->loadUserByAccessToken($accessToken);
  68.             })
  69.         );
  70.     }
  71.     public function onAuthenticationSuccess(Request $requestTokenInterface $tokenstring $firewallName): ?Response
  72.     {
  73.         // on success, let the request continue
  74.         return null;
  75.     }
  76.     public function onAuthenticationFailure(Request $requestAuthenticationException $exception): ?Response
  77.     {
  78.         $data = [
  79.             // you may want to customize or obfuscate the message first
  80.             'message' => strtr($exception->getMessageKey(), $exception->getMessageData())
  81.             // or to translate this message
  82.             // $this->translator->trans($exception->getMessageKey(), $exception->getMessageData())
  83.         ];
  84.         return new JsonResponse($dataResponse::HTTP_UNAUTHORIZED);
  85.     }
  86. }