src/Controller/OAuth/TokenController.php line 62

Open in your IDE?
  1. <?php
  2. namespace App\Controller\OAuth;
  3. use GuzzleHttp\Utils;
  4. use App\Service\CartService;
  5. use App\OAuth\OAuth2 as OAuth2;
  6. use App\Entity\OAuth\AccessToken;
  7. use App\Repository\CartRepository;
  8. use League\OAuth2\Server\CryptKey;
  9. use App\OAuth\GoogleGrantExtension;
  10. use App\Repository\PersonRepository;
  11. use App\OAuth\FacebookGrantExtension;
  12. use Doctrine\Persistence\ManagerRegistry;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use App\Repository\OAuth\AccessTokenRepository;
  16. use Menke\UserBundle\Repository\UserRepository;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  19. use League\OAuth2\Server\AuthorizationValidators\BearerTokenValidator;
  20. use League\Bundle\OAuth2ServerBundle\Controller\TokenController as BaseTokenController;
  21. use League\Bundle\OAuth2ServerBundle\Manager\AccessTokenManagerInterface;
  22. class TokenController extends AbstractController
  23. {
  24.     private $baseTokenController;
  25.     private $manager;
  26.     private $accessTokenManagerInterface;
  27.     private $accessTokenRepository;
  28.     private $cartRepo;
  29.     private $personRepo;
  30.     private $cartService;
  31.     private $userRepo;
  32.     private $bearerTokenValidator;
  33.     public function __construct(
  34.         BaseTokenController $baseTokenController,
  35.         ManagerRegistry $manager,
  36.         AccessTokenManagerInterface $accessTokenManagerInterface,
  37.         AccessTokenRepository $accessTokenRepository,
  38.         CartRepository $cartRepo,
  39.         PersonRepository $personRepo,
  40.         CartService $cartService,
  41.         UserRepository $userRepo,
  42.         BearerTokenValidator $bearerTokenValidator
  43.     ) {
  44.         $this->baseTokenController $baseTokenController;
  45.         $this->manager $manager->getManager();
  46.         $this->accessTokenManagerInterface $accessTokenManagerInterface;
  47.         $this->accessTokenRepository $accessTokenRepository;
  48.         $this->cartRepo $cartRepo;
  49.         $this->personRepo $personRepo;
  50.         $this->cartService $cartService;
  51.         $this->userRepo $userRepo;
  52.         $this->bearerTokenValidator $bearerTokenValidator;
  53.     }
  54.     /**
  55.      * @Route("/oauth/v2/token", name="oauth_v2_token", methods="POST")
  56.      */
  57.     public function indexAction(Request $request): Response
  58.     {
  59.         $result $this->baseTokenController->indexAction($request);
  60.         if ($request->getMethod() === 'POST') {
  61.             $inputData $request->request->all();
  62.             if (
  63.                 ($inputData['grant_type'] == OAuth2::GRANT_TYPE_USER_CREDENTIALS ||
  64.                     $inputData['grant_type'] == FacebookGrantExtension::GRANT_TYPE ||
  65.                     $inputData['grant_type'] == GoogleGrantExtension::GRANT_TYPE) &&
  66.                     $result->getStatusCode() == 200 &&
  67.                     array_key_exists('access_token'$inputData) &&
  68.                     !empty($inputData['access_token'])
  69.             ) {
  70.                 $this->bearerTokenValidator->setPublicKey(new CryptKey($this->getParameter('kernel.project_dir')."/config/jwt/public.key"));
  71.                 $old_token $this->bearerTokenValidator->getJwtConfiguration()->parser()->parse($inputData['access_token']);
  72.                 $oldAccessToken $this->accessTokenRepository->findOneBy(['identifier' => $old_token->claims()->get('jti')]);
  73.                 if (!$oldAccessToken) {
  74.                     return $result;
  75.                 }
  76.                 
  77.                 $resultObj json_decode($result->getContent());
  78.                 $new_token $this->bearerTokenValidator->getJwtConfiguration()->parser()->parse($resultObj->access_token);
  79.                 $accessTokenManager $this->accessTokenManagerInterface->find($new_token->claims()->get('jti'));
  80.                 $user $this->userRepo->findOneBy(['username' => $inputData['username']]);
  81.                 
  82.                 if (!$accessTokenManager && !$user) {
  83.                     return $result;
  84.                 }
  85.                 $newAccessToken = new AccessToken();
  86.                 $newAccessToken->setIdentifier($accessTokenManager->getIdentifier());
  87.                 $newAccessToken->setClient($accessTokenManager->getClient());
  88.                 $newAccessToken->setExpiry(new \DateTime());
  89.                 $newAccessToken->setUser($user);
  90.                 $newAccessToken->setUserIdentifier($user->getUsername());
  91.                 $this->manager->persist($newAccessToken);
  92.                 $this->manager->flush();
  93.                 $cart $this->cartRepo->findOneBy(['accessToken' => $oldAccessToken]);
  94.                 if (!$cart) {
  95.                     return $result;
  96.                 }
  97.                 $customer $this->personRepo->findOneBy(['user' => $newAccessToken->getUser()]);
  98.                 $customerCart $this->cartRepo->findOneBy(['customer' => $customer]);
  99.                 if (!$customerCart) {
  100.                     $cart->setCustomer($customer);
  101.                     $cart->setAccessToken(null);
  102.                 } else {
  103.                     foreach ($cart->getItems() as $item) {
  104.                         $customerItem $this->cartService->getCartItemIfExists($item->getCourseOccurrence(), $customerCart$item->getCourseItem() ? true false);
  105.                         if ($customerItem) {
  106.                             $customerItem->increaseQuantity($item->getQuantity());
  107.                             if ($item->getCourseItem()) {
  108.                                 $item->setCourseItem(null);
  109.                             }
  110.                             foreach ($item->getParticipants() as $participant) {
  111.                                 $item->removeParticipant($participant);
  112.                                 $customerItem->addParticipant($participant);
  113.                             }
  114.                             $cart->removeItem($item);
  115.                         } else {
  116.                             $cart->removeItem($item);
  117.                             $customerCart->addItem($item);
  118.                         }
  119.                     }
  120.                     $this->manager->remove($cart);
  121.                 }
  122.                 $this->manager->flush();
  123.             }
  124.         }
  125.         if ($result->getStatusCode() == 400) {
  126.             $content json_decode($result->getContent());
  127.             if ($content->error == OAuth2::ERROR_INVALID_GRANT) {
  128.                 $inputData $request->request->all();
  129.                 if (array_key_exists('username'$inputData)) {
  130.                     try {
  131.                         $user $this->userRepo->findOneBy(['username' => $inputData['username']]);
  132.                         if ($user && !$user->isEnabled()) {
  133.                             $content->error_description 'Der angegebene Benutzer ist nicht aktiviert.';
  134.                             $result->setContent(Utils::jsonEncode($content));
  135.                         }
  136.                     } catch (\Exception $e) {
  137.                     }
  138.                 }
  139.             }
  140.         }
  141.         return $result;
  142.     }
  143. }