<?phpnamespace App\Controller\OAuth2;use App\Entity\Core\OAuthClient;use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTTokenManagerInterface;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\JsonResponse;use Symfony\Component\Security\Core\User\UserProviderInterface;use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\Routing\Annotation\Route;use Symfony\Component\HttpFoundation\RedirectResponse;use Symfony\Component\Security\Core\Exception\AccessDeniedException;use Symfony\Component\Security\Core\Security;use Symfony\Component\Security\Core\User\UserInterface;use Doctrine\ORM\EntityManagerInterface;use App\Security\OAuthScopes;class AuthorizeController extends AbstractController{ private $jwtManager; private $userProvider; private $passwordHasher; private $em; public function __construct( JWTTokenManagerInterface $jwtManager, UserProviderInterface $userProvider, UserPasswordHasherInterface $passwordHasher, Security $security, EntityManagerInterface $em ) { $this->em = $em; $this->jwtManager = $jwtManager; $this->userProvider = $userProvider; $this->passwordHasher = $passwordHasher; $this->security = $security; } public function authorize(Request $request) { $requestedScopes = explode(' ', $request->query->get('scope', '')); $availableScopes = OAuthScopes::getAvailableScopes(); foreach ($requestedScopes as $scope) { if (!array_key_exists($scope, $availableScopes)) { return new JsonResponse(['error' => 'invalid_scope', 'scope' => $scope], JsonResponse::HTTP_BAD_REQUEST); } } // Récupérer l'utilisateur courant $user = $this->getUser(); if (!$user instanceof UserInterface) { // Conserver les paramètres d'origine (redirect_uri, state, scope) $redirectUri = $request->query->get('redirect_uri'); $clientId = $request->query->get('client_id'); $state = $request->query->get('state'); $scope = $request->query->get('scope', ''); // Générer l'URL de redirection vers la page de login avec les paramètres $loginUrl = $this->generateUrl('oauth2_login', [ 'redirect_uri' => $redirectUri, 'client_id' => $clientId, 'state' => $state, 'scope' => $scope, ]); // Rediriger vers la page de login return new RedirectResponse($loginUrl); } // Récupérer les paramètres de la requête $clientId = $request->query->get('client_id'); $redirectUri = $request->query->get('redirect_uri'); $responseType = $request->query->get('response_type'); // e.g., "code" $scope = $request->query->get('scope'); $state = $request->query->get('state'); // Vérifier que le client existe et que les paramètres sont valides $client = $this->em->getRepository(OAuthClient::class)->findOneBy(['clientId' => $clientId]); if (!$client) { throw new AccessDeniedException('Client not found or invalid.'); } if ($client->getRedirectUris() && !in_array($redirectUri, $client->getRedirectUris())) { throw new AccessDeniedException('Invalid redirect URI.'); } if ($responseType !== 'code') { throw new AccessDeniedException('Unsupported response type.'); } // Vérifier si l'utilisateur a déjà autorisé ce client if ($request->isMethod('POST')) { // L'utilisateur a soumis le formulaire d'autorisation if ($request->request->get('approve')) { // L'utilisateur a approuvé la demande // Générer un code d'autorisation $authorizationCode = bin2hex(random_bytes(16)); // Code simple pour l'exemple // Enregistrer le code d'autorisation (vous devrez implémenter une entité pour stocker cela) // Rediriger vers l'URI de redirection avec le code d'autorisation $redirectUrl = sprintf( '%s?code=%s&state=%s', $redirectUri, $authorizationCode, urlencode($state) ); return new RedirectResponse($redirectUrl); } else { // L'utilisateur a refusé la demande $redirectUrl = sprintf( '%s?error=access_denied&state=%s', $redirectUri, urlencode($state) ); return new RedirectResponse($redirectUrl); } } // Afficher la page de confirmation d'autorisation return $this->render('security/oauth2/authorize.html.twig', [ 'client' => $client, 'scopes' => $requestedScopes, 'availableScopes' => OAuthScopes::getAvailableScopes(), 'state' => $state, 'redirectUri' => $redirectUri, ]); }}