src/Controller/OAuth2/AuthorizeController.php line 27

Open in your IDE?
  1. <?php
  2. namespace App\Controller\OAuth2;
  3. use App\Entity\Core\OAuthClient;
  4. use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTTokenManagerInterface;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpFoundation\JsonResponse;
  7. use Symfony\Component\Security\Core\User\UserProviderInterface;
  8. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Symfony\Component\HttpFoundation\RedirectResponse;
  12. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  13. use Symfony\Component\Security\Core\Security;
  14. use Symfony\Component\Security\Core\User\UserInterface;
  15. use Doctrine\ORM\EntityManagerInterface;
  16. use App\Security\OAuthScopes;
  17. class AuthorizeController extends AbstractController
  18. {
  19.     private $jwtManager;
  20.     private $userProvider;
  21.     private $passwordHasher;
  22.     private $em;
  23.     public function __construct(
  24.         JWTTokenManagerInterface $jwtManager,
  25.         UserProviderInterface $userProvider,
  26.         UserPasswordHasherInterface $passwordHasher,
  27.         Security $security,
  28.         EntityManagerInterface $em
  29.     ) {
  30.         $this->em $em;
  31.         $this->jwtManager $jwtManager;
  32.         $this->userProvider $userProvider;
  33.         $this->passwordHasher $passwordHasher;
  34.         $this->security $security;
  35.     }
  36.     public function authorize(Request $request)
  37.     {
  38.         $requestedScopes explode(' '$request->query->get('scope'''));
  39.         $availableScopes OAuthScopes::getAvailableScopes();
  40.         foreach ($requestedScopes as $scope) {
  41.             if (!array_key_exists($scope$availableScopes)) {
  42.                 return new JsonResponse(['error' => 'invalid_scope''scope' => $scope], JsonResponse::HTTP_BAD_REQUEST);
  43.             }
  44.         }
  45.         // Récupérer l'utilisateur courant
  46.         $user $this->getUser();
  47.         if (!$user instanceof UserInterface) {
  48.             // Conserver les paramètres d'origine (redirect_uri, state, scope)
  49.             $redirectUri $request->query->get('redirect_uri');
  50.             $clientId $request->query->get('client_id');
  51.             $state $request->query->get('state');
  52.             $scope $request->query->get('scope''');
  53.             // Générer l'URL de redirection vers la page de login avec les paramètres
  54.             $loginUrl $this->generateUrl('oauth2_login', [
  55.                 'redirect_uri' => $redirectUri,
  56.                 'client_id' => $clientId,
  57.                 'state' => $state,
  58.                 'scope' => $scope,
  59.             ]);
  60.             // Rediriger vers la page de login
  61.             return new RedirectResponse($loginUrl);
  62.         }
  63.         // Récupérer les paramètres de la requête
  64.         $clientId $request->query->get('client_id');
  65.         $redirectUri $request->query->get('redirect_uri');
  66.         $responseType $request->query->get('response_type'); // e.g., "code"
  67.         $scope $request->query->get('scope');
  68.         $state $request->query->get('state');
  69.         // Vérifier que le client existe et que les paramètres sont valides
  70.         $client $this->em->getRepository(OAuthClient::class)->findOneBy(['clientId' => $clientId]);
  71.         if (!$client) {
  72.             throw new AccessDeniedException('Client not found or invalid.');
  73.         }
  74.         if ($client->getRedirectUris() && !in_array($redirectUri$client->getRedirectUris())) {
  75.             throw new AccessDeniedException('Invalid redirect URI.');
  76.         }
  77.         if ($responseType !== 'code') {
  78.             throw new AccessDeniedException('Unsupported response type.');
  79.         }
  80.         // Vérifier si l'utilisateur a déjà autorisé ce client
  81.         if ($request->isMethod('POST')) {
  82.             // L'utilisateur a soumis le formulaire d'autorisation
  83.             if ($request->request->get('approve')) {
  84.                 // L'utilisateur a approuvé la demande
  85.                 // Générer un code d'autorisation
  86.                 $authorizationCode bin2hex(random_bytes(16)); // Code simple pour l'exemple
  87.                 // Enregistrer le code d'autorisation (vous devrez implémenter une entité pour stocker cela)
  88.                 // Rediriger vers l'URI de redirection avec le code d'autorisation
  89.                 $redirectUrl sprintf(
  90.                     '%s?code=%s&state=%s',
  91.                     $redirectUri,
  92.                     $authorizationCode,
  93.                     urlencode($state)
  94.                 );
  95.                 return new RedirectResponse($redirectUrl);
  96.             } else {
  97.                 // L'utilisateur a refusé la demande
  98.                 $redirectUrl sprintf(
  99.                     '%s?error=access_denied&state=%s',
  100.                     $redirectUri,
  101.                     urlencode($state)
  102.                 );
  103.                 return new RedirectResponse($redirectUrl);
  104.             }
  105.         }
  106.         // Afficher la page de confirmation d'autorisation
  107.         return $this->render('security/oauth2/authorize.html.twig', [
  108.             'client' => $client,
  109.             'scopes' => $requestedScopes,
  110.             'availableScopes' => OAuthScopes::getAvailableScopes(),
  111.             'state' => $state,
  112.             'redirectUri' => $redirectUri,
  113.         ]);
  114.     }
  115. }