src/Controller/Frontend/SecurityController.php line 145

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Frontend;
  3. use App\Entity\User\AccessToken;
  4. use App\Exception\RefreshTokenExpiredException;
  5. use App\Service\AccessTokenService;
  6. use App\ViewModel\Frontend\AccessTokenViewModel;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Exception;
  9. use Nelmio\ApiDocBundle\Annotation\Model;
  10. use Nelmio\ApiDocBundle\Annotation\Security;
  11. use OpenApi\Annotations as OA;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\Form\Extension\Core\Type\FormType;
  14. use Symfony\Component\Form\Extension\Core\Type\TextType;
  15. use Symfony\Component\Form\FormFactoryInterface;
  16. use Symfony\Component\HttpFoundation\JsonResponse;
  17. use Symfony\Component\HttpFoundation\Request;
  18. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use Symfony\Component\Validator\Constraints\NotNull;
  21. class SecurityController extends AbstractController {
  22.     /**
  23.      * @var AccessTokenService
  24.      */
  25.     private $accessTokenService;
  26.     /**
  27.      * @var EntityManagerInterface
  28.      */
  29.     private $entityManager;
  30.     /**
  31.      * @var FormFactoryInterface
  32.      */
  33.     private $formFactory;
  34.     /**
  35.      * SecurityController constructor.
  36.      *
  37.      * @param AccessTokenService $accessTokenService
  38.      * @param EntityManagerInterface $entityManager
  39.      * @param FormFactoryInterface $formFactory
  40.      */
  41.     public function __construct(
  42.         AccessTokenService $accessTokenService,
  43.         EntityManagerInterface $entityManager,
  44.         FormFactoryInterface $formFactory
  45.     ) {
  46.         $this->accessTokenService $accessTokenService;
  47.         $this->entityManager $entityManager;
  48.         $this->formFactory $formFactory;
  49.     }
  50.     /**
  51.      * Perform user login
  52.      *
  53.      * @Route(path="/login", methods={"POST"})
  54.      * @Security(name=null)
  55.      * @OA\RequestBody(
  56.      *     @OA\JsonContent(
  57.      *         type="object",
  58.      *         @OA\Property(property="username", type="string", nullable=false),
  59.      *         @OA\Property(property="password", type="string", nullable=false)
  60.      *     )
  61.      * )
  62.      * @OA\Response(
  63.      *     response=200,
  64.      *     description="The access token",
  65.      *     @Model(type=AccessTokenViewModel::class)
  66.      * )
  67.      * @OA\Response(
  68.      *     response=401,
  69.      *     description="Authentication failed",
  70.      *     @OA\JsonContent(
  71.      *         type="object",
  72.      *         @OA\Property(property="error", type="string")
  73.      *     )
  74.      * )
  75.      * @throws Exception
  76.      */
  77.     public function loginAction() {
  78.         $user $this->getUser();
  79.         $accessToken $this->accessTokenService->createAccessToken($user);
  80.         $accessTokenViewModel AccessTokenViewModel::create($accessToken);
  81.         return $this->json($accessTokenViewModel);
  82.     }
  83.     /**
  84.      * Refresh an expired accessToken with the refreshToken
  85.      *
  86.      * @Route(path="/token", methods={"POST"})
  87.      * @param Request $request
  88.      *
  89.      * @return JsonResponse
  90.      * @throws RefreshTokenExpiredException
  91.      * @throws Exception
  92.      *
  93.      * @OA\RequestBody(
  94.      *     @OA\JsonContent(
  95.      *          @OA\Property(property="refreshToken", type="string", nullable="false")
  96.      *     )
  97.      * )
  98.      * @OA\Response(
  99.      *     response="200",
  100.      *     description="Refreshed token",
  101.      *     @Model(type=AccessTokenViewModel::class)
  102.      * )
  103.      * @OA\Response(
  104.      *     response="400",
  105.      *     ref="#/components/schemas/BadRequestError"
  106.      * )
  107.      * @OA\Response(
  108.      *     response="404",
  109.      *     ref="#/components/schemas/NotFoundError"
  110.      * )
  111.      */
  112.     public function refreshTokenAction(Request $request) {
  113.         $form $this->formFactory
  114.             ->create(FormType::class)
  115.             ->add(
  116.                 'refreshToken',
  117.                 TextType::class,
  118.                 [
  119.                     'constraints' => [new NotNull()],
  120.                 ]
  121.             );
  122.         $form->submit(json_decode($request->getContent(), true));
  123.         if(!$form->isSubmitted() || !$form->isValid()) {
  124.             throw new BadRequestHttpException();
  125.         }
  126.         $refreshToken $form->get('refreshToken')->getData();
  127.         $accessToken $this->entityManager
  128.             ->getRepository(AccessToken::class)
  129.             ->findByRefreshToken($refreshToken);
  130.         if($accessToken === null) {
  131.             throw $this->createNotFoundException();
  132.         }
  133.         $accessToken $this->accessTokenService
  134.             ->refreshAccessToken($accessToken);
  135.         $accessTokenViewModel AccessTokenViewModel::create($accessToken);
  136.         return $this->json($accessTokenViewModel);
  137.     }
  138. }