src/EventSubscriber/AuthorizationCodeSubscriber.php line 32

  1. <?php
  2. namespace App\EventSubscriber;
  3. use League\Bundle\OAuth2ServerBundle\Event\AuthorizationRequestResolveEvent;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpFoundation\RedirectResponse;
  6. use Symfony\Component\HttpFoundation\RequestStack;
  7. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  8. use Symfony\Component\Security\Core\Security;
  9. use Symfony\Component\Security\Core\User\UserInterface;
  10. use Symfony\Component\Security\Http\FirewallMapInterface;
  11. use Symfony\Component\Security\Http\Util\TargetPathTrait;
  12. class AuthorizationCodeSubscriber implements EventSubscriberInterface
  13. {
  14.     use TargetPathTrait;
  15.     private Security $security;
  16.     private UrlGeneratorInterface $urlGenerator;
  17.     private RequestStack $requestStack;
  18.     private $firewallName;
  19.     public function __construct(Security $securityUrlGeneratorInterface $urlGeneratorRequestStack $requestStackFirewallMapInterface $firewallMap)
  20.     {
  21.         $this->security $security;
  22.         $this->urlGenerator $urlGenerator;
  23.         $this->requestStack $requestStack;
  24.         $this->firewallName $firewallMap->getFirewallConfig($requestStack->getCurrentRequest())->getName();
  25.     }
  26.     public function onLeagueOauth2ServerEventAuthorizationRequestResolve(AuthorizationRequestResolveEvent $event): void
  27.     {
  28.         $request $this->requestStack->getCurrentRequest();
  29.         $user $this->security->getUser();
  30.         $this->saveTargetPath($request->getSession(), $this->firewallName$request->getUri());
  31.         $response = new RedirectResponse($this->urlGenerator->generate('app_login'), 307);
  32.         if ($user instanceof UserInterface) {
  33.             if ($request->getSession()->get('consent_granted') !== null) {
  34.                 $event->resolveAuthorization($request->getSession()->get('consent_granted'));
  35.                 $request->getSession()->remove('consent_granted');
  36.                 return;
  37.             }
  38.             $response = new RedirectResponse($this->urlGenerator->generate('app_consent'$request->query->all()), 307);
  39.         }
  40.         $event->setResponse($response);
  41.     }
  42.     public static function getSubscribedEvents(): array
  43.     {
  44.         return [
  45.             'league.oauth2_server.event.authorization_request_resolve' => 'onLeagueOauth2ServerEventAuthorizationRequestResolve',
  46.         ];
  47.     }
  48. }