src/StoreFront/Controller/BodymedIDController.php line 89

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Bodymed\Webshop\StoreFront\Controller;
  4. use Bodymed\Webshop\BodymedID\DataProvider as BodymedIdDataProvider;
  5. use Bodymed\Webshop\Core\Checkout\Customer\SalesChannel\LoginRoute;
  6. use Bodymed\Webshop\StoreFront\Security\OAuth\BodymedIDResourceOwner;
  7. use KnpU\OAuth2ClientBundle\Client\OAuth2Client;
  8. use League\OAuth2\Client\Provider\Exception\IdentityProviderException;
  9. use League\OAuth2\Client\Token\AccessToken;
  10. use Psr\Log\LoggerInterface;
  11. use Shopware\Core\Checkout\Cart\SalesChannel\CartService;
  12. use Shopware\Core\Checkout\Customer\Exception\BadCredentialsException;
  13. use Shopware\Core\Checkout\Customer\SalesChannel\AbstractLoginRoute;
  14. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  15. use Shopware\Core\Framework\Validation\DataBag\RequestDataBag;
  16. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  17. use Shopware\Storefront\Controller\StorefrontController;
  18. use Symfony\Component\HttpFoundation\RedirectResponse;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  22. use Symfony\Component\Routing\Annotation\Route;
  23. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  24. use Symfony\Component\Routing\RouterInterface;
  25. /**
  26.  * @RouteScope(scopes={"storefront"})
  27.  */
  28. class BodymedIDController extends StorefrontController
  29. {
  30.     public const REDIRECT_SESSION_KEY 'redirectTo';
  31.     public const REDIRECT_SESSION_Parameter 'redirectParameters';
  32.     public const REDIRECT_DEFAULT_ROUTE 'frontend.account.home.page';
  33.     private OAuth2Client $oauthClient;
  34.     private AbstractLoginRoute $loginRoute;
  35.     private CartService $cartService;
  36.     private BodymedIdDataProvider $bodymedIdDataProvider;
  37.     private RouterInterface $router;
  38.     private SessionInterface $session;
  39.     private LoggerInterface $logger;
  40.     public function __construct(
  41.         OAuth2Client $bodymedID_OAuthClient,
  42.         AbstractLoginRoute $loginRoute,
  43.         CartService $cartService,
  44.         BodymedIdDataProvider $bodymedIdDataProvider,
  45.         RouterInterface $router,
  46.         SessionInterface $session,
  47.         LoggerInterface $logger
  48.     ) {
  49.         $this->oauthClient $bodymedID_OAuthClient;
  50.         $this->loginRoute $loginRoute;
  51.         $this->cartService $cartService;
  52.         $this->bodymedIdDataProvider $bodymedIdDataProvider;
  53.         $this->router $router;
  54.         $this->session $session;
  55.         $this->logger $logger;
  56.     }
  57.     /**
  58.      * @Route("/bodymed-id/connect", name="frontend.bodymed_id.connect", options={"seo"="false"}, methods={"GET"})
  59.      */
  60.     public function connect(Request $requestRequestDataBag $dataSalesChannelContext $context): RedirectResponse
  61.     {
  62.         if ($context->getCustomer()) {
  63.             return $this->redirectToRoute('frontend.account.home.page');
  64.         }
  65.         $redirectTo $request->get('redirectTo''frontend.account.home.page');
  66.         $redirectParameters '';
  67.         if ($request->get('redirectParameters')) {
  68.             $redirectParameters $this->decodeParam($request'redirectParameters');
  69.         }
  70.         $this->session->set(self::REDIRECT_SESSION_KEY$redirectTo);
  71.         $this->session->set(self::REDIRECT_SESSION_Parameter$redirectParameters);
  72.         return $this->oauthClient->redirect([
  73.             'email profile roles',
  74.         ]);
  75.     }
  76.     /**
  77.      * @Route("/bodymed-id/connect-check", name="frontend.bodymed_id.connect_check", options={"seo"="false"}, methods={"GET"})
  78.      */
  79.     public function connectCheck(Request $requestRequestDataBag $dataSalesChannelContext $context): ?Response
  80.     {
  81.         try {
  82.             /* @var $accessToken AccessToken */
  83.             $accessToken $this->oauthClient->getAccessToken();
  84.             /* @var $user BodymedIDResourceOwner */
  85.             $user $this->oauthClient->fetchUserFromToken($accessToken);
  86.             if (false === $user->hasRole($this->bodymedIdDataProvider->getRequiredRole())) {
  87.                 throw new BadCredentialsException();
  88.             }
  89.             $data->set('email'$user->getEmail());
  90.             $data->set(LoginRoute::FROM_BODYMED_ID_DATA_BAG_KEYtrue);
  91.             $token $this->loginRoute->login($data$context)->getToken();
  92.             if (!empty($token)) {
  93.                 /*if (Feature::isActive('FEATURE_NEXT_10058')) {
  94.                     $this->addCartErrors($this->cartService->getCart($token, $context));
  95.                 }*/
  96.                 $redirectRoute $this->session->get(self::REDIRECT_SESSION_KEY) ?? self::REDIRECT_DEFAULT_ROUTE;
  97.                 $this->session->remove(self::REDIRECT_SESSION_KEY);
  98.                 if ('frontend.detail.page' == $redirectRoute || 'frontend.navigation.page' === $redirectRoute) {
  99.                     $redirectParams $this->session->get(self::REDIRECT_SESSION_Parameter) ?? '';
  100.                     if (\is_string($redirectParams)) {
  101.                         $redirectParams \json_decode($redirectParamstrue);
  102.                     }
  103.                     if (\is_array($redirectParams)) {
  104.                         if (isset($redirectParams['productId'])) {
  105.                             return $this->redirectToRoute($redirectRoute, [
  106.                                 'productId' => $redirectParams['productId'],
  107.                                 't' => \microtime(true),
  108.                             ]);
  109.                         }
  110.                         if (isset($redirectParams['navigationId'])) {
  111.                             return $this->redirectToRoute($redirectRoute, [
  112.                                 'navigationId' => $redirectParams['navigationId'],
  113.                                 't' => \microtime(true),
  114.                             ]);
  115.                         }
  116.                     }
  117.                     /* Fallback to Account-Home */
  118.                     return $this->redirectToRoute('frontend.account.home.page');
  119.                 } else {
  120.                     try {
  121.                         $route $this->router->generate($redirectRoute);
  122.                         return $this->redirect($route);
  123.                     } catch (\Exception $e) {
  124.                         $this->logger->error($e->getMessage(), [
  125.                             'exception' => $e,
  126.                             'user.email' => $user->getEmail(),
  127.                         ]);
  128.                         return $this->redirectToRoute(self::REDIRECT_DEFAULT_ROUTE);
  129.                     }
  130.                 }
  131.             }
  132.         } catch (IdentityProviderException $e) {
  133.             #$this->addFlash('danger', 'Es ist etwas schief gelaufen. Bitte versuchen Sie es noch einmal');
  134.             $this->logger->error($e->getMessage(), [
  135.                 'exception' => $e,
  136.                 'request_data' => $data->all(),
  137.             ]);
  138.             $redirectRoute $this->session->get(self::REDIRECT_SESSION_KEY) ?? 'frontend.account.home.page';
  139.             return $this->redirectToRoute($redirectRoute);
  140.         }
  141.     }
  142.     /**
  143.      * @Route("/bodymed-id/logout", name="frontend.bodymed_id.logout", options={"seo"="false"}, methods={"GET"})
  144.      */
  145.     public function logout(Request $request): RedirectResponse
  146.     {
  147.         $accountUrl $this->router->generate(
  148.             'frontend.account.logout.page',
  149.             [],
  150.             UrlGeneratorInterface::ABSOLUTE_URL
  151.         );
  152.         $redirectUri $this->bodymedIdDataProvider->getLogoutUrl($accountUrl);
  153.         return new RedirectResponse($redirectUri->__toString());
  154.     }
  155.     private function isValidRedirectUrl(?string $redirectUrl): bool
  156.     {
  157.         return false !== \filter_var($redirectUrlFILTER_VALIDATE_URL);
  158.     }
  159. }