src/Listener/AuthorizationCodeListener.php line 30

Open in your IDE?
  1. <?php
  2. namespace App\Listener;
  3. use Nyholm\Psr7\Response;
  4. use Symfony\Component\HttpFoundation\RequestStack;
  5. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  6. use Trikoder\Bundle\OAuth2Bundle\Event\AuthorizationRequestResolveEvent;
  7. use Symfony\Component\Security\Core\Security;
  8. use Twig\Environment;
  9. final class AuthorizationCodeListener
  10. {
  11.     private $urlGenerator;
  12.     private $requestStack;
  13.     private $twig;
  14.     public function __construct(
  15.         UrlGeneratorInterface $urlGenerator,
  16.         RequestStack $requestStack,
  17.         Environment $twig,
  18.         Security $security
  19.     ) {
  20.         $this->urlGenerator $urlGenerator;
  21.         $this->requestStack $requestStack;
  22.         $this->twig         $twig;
  23.         $this->security     $security;
  24.     }
  25.     public function onAuthorizationRequestResolve(AuthorizationRequestResolveEvent $event): void
  26.     {
  27.         $request $this->requestStack->getCurrentRequest();
  28.         // only handle post requests for logged-in users:
  29.         // get requests will be intercepted and shown the login form
  30.         // other verbs we will handle as an authorization denied
  31.         // and this implementation ensures a user is set at this point already
  32.         if (!\Empire\Core\Login::isLoggedIn()) {
  33.             $event->setResponse(
  34.                             new Response(
  35.                                 302,
  36.                                 [
  37.                                     'Location' => $this->urlGenerator->generate(
  38.                                         'login',
  39.                                         [
  40.                                             'client'    => "Forum"
  41.                                             'returnUrl' => $this->requestStack->getMasterRequest()->getUri(),
  42.                                         ]
  43.                                     ),
  44.                                 ]
  45.                             )
  46.                         );
  47.             return;
  48.         }
  49.         if (!$request->request->has('action')) {
  50.             // 1. successful login, goes to grant page
  51.             $user $this->security->getUser()->initialize();
  52.             preg_match('~https?:\/\/(.*?[^\/])/~s'$request->query->get('redirect_uri'), $cancelUrl);
  53.             $content $this->twig->render('security/grant.html.twig', [
  54.                 'scopes' => $event->getScopes(),
  55.                 'client' => $event->getClient(),
  56.                 'grant'  => AuthorizationRequestResolveEvent::AUTHORIZATION_APPROVED,
  57.                 // very simple way to ensure user gets to this point in the
  58.                 // flow when granting or denying is to pre-add their credentials
  59.                 'name' => $request->request->get('name'),
  60.                 'cancelUrl' => $cancelUrl[0],
  61.                 'user' => $user,
  62.             ]);
  63.             $response = new Response(200, [], $content);
  64.             $event->setResponse($response);
  65.         } else {
  66.             // 2. grant operation, either grants or denies
  67.             if ($request->request->get('action') == AuthorizationRequestResolveEvent::AUTHORIZATION_APPROVED) {
  68.                 $event->resolveAuthorization(AuthorizationRequestResolveEvent::AUTHORIZATION_APPROVED);
  69.             } else {
  70.                 $event->resolveAuthorization(AuthorizationRequestResolveEvent::AUTHORIZATION_DENIED);
  71.             }
  72.         }
  73.     }
  74. }