src/Infrastructure/Security/Auth/TokenAuthenticator.php line 56

Open in your IDE?
  1. <?php
  2. namespace App\Infrastructure\Security\Auth;
  3. use App\Application\EventBus\Event\User\UserAuthenticatedEvent;
  4. use App\Database\Domain\Repository\AccessTokenRepository;
  5. use App\Database\Domain\Repository\UserRepository;
  6. use App\Infrastructure\Messenger\EventBus\EventBusInterface;
  7. use Symfony\Component\HttpFoundation\Request;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\HttpFoundation\JsonResponse;
  10. use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
  11. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  12. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  13. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
  14. use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
  15. use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
  16. use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport;
  17. use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\CustomCredentials;
  18. class TokenAuthenticator extends AbstractAuthenticator
  19. {
  20.     private AccessTokenRepository $accessTokenRepository;
  21.     private EventBusInterface $eventBus;
  22.     private UserRepository $userRepository;
  23.     public function __construct(
  24.         AccessTokenRepository $accessTokenRepository,
  25.         EventBusInterface $eventBus,
  26.         UserRepository $userRepository
  27.     ) {
  28.         $this->accessTokenRepository $accessTokenRepository;
  29.         $this->eventBus $eventBus;
  30.         $this->userRepository $userRepository;
  31.     }
  32.     public function supports(Request $request): ?bool
  33.     {
  34.         return $request->headers->has('X-AUTH-TOKEN') || $request->headers->has('X-NOT-REGISTERED-TOKEN');
  35.     }
  36.     public function authenticate(Request $request): ?Passport
  37.     {
  38.         if ($request->headers->get('X-AUTH-TOKEN')) {
  39.             $userBadge = new UserBadge($request->headers->get('X-AUTH-TOKEN'), function($token) {
  40.                 return $this->accessTokenRepository->findByToken($token)->getUser();
  41.             });
  42.         } else {
  43.             $userBadge = new UserBadge($request->headers->get('X-NOT-REGISTERED-TOKEN'), function($token) {
  44.                 return $this->userRepository->findOneBy(['notRegisteredToken' => $token]);
  45.             });
  46.         }
  47.         return new Passport(
  48.             $userBadge,
  49.             new CustomCredentials(function($input) {
  50.                 return true;
  51.             }, null)
  52.         );
  53.         throw new CustomUserMessageAuthenticationException('Failed to authenticate with given headers');
  54.     }
  55.     public function onAuthenticationSuccess(Request $requestTokenInterface $tokenstring $firewallName): ?Response
  56.     {
  57.         $this->eventBus->fire(new UserAuthenticatedEvent($token->getUser()));
  58.         return null;
  59.     }
  60.     public function onAuthenticationFailure(Request $requestAuthenticationException $exception): JsonResponse
  61.     {
  62.         return new JsonResponse(['errors' => [$exception->getMessage()]], Response::HTTP_FORBIDDEN);
  63.     }
  64.     public function start(Request $request, ?AuthenticationException $authException null): JsonResponse
  65.     {
  66.         return new JsonResponse(['message' => $authException->getMessage()], Response::HTTP_UNAUTHORIZED);
  67.     }
  68. }