<?phpnamespace App\Controller\OAuth2;use App\Entity\Core\OAuthAuthorizationCode;use App\Entity\Core\Users;use App\Services\Core\Core;use Doctrine\ORM\EntityManagerInterface;use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;use Symfony\Component\EventDispatcher\EventDispatcherInterface;use Symfony\Component\HttpFoundation\Cookie;use Symfony\Component\HttpFoundation\JsonResponse;use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;use Symfony\Component\Routing\Annotation\Route;use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;use Symfony\Component\HttpFoundation\RedirectResponse;class LoginController extends AbstractController{ private $authenticationUtils; private $em; public function __construct(AuthenticationUtils $authenticationUtils, EntityManagerInterface $em ) { $this->authenticationUtils = $authenticationUtils; $this->em = $em; } public function login(AuthenticationUtils $authenticationUtils, Request $request): Response { // Obtenir l'URL de callback depuis les paramètres de requête $callbackUrl = $request->query->get('redirect_uri'); $client_id = $request->query->get('client_id'); // Si l'utilisateur est déjà authentifié, générer un code d'autorisation et rediriger vers l'URL de callback if ($this->getUser()) { // Générer un code d'autorisation (ou un token directement selon votre flux) $authorizationCode = bin2hex(random_bytes(16)); // Par exemple, générer un code aléatoire // Stocker le code d'autorisation avec les détails nécessaires (utilisateur, client, scopes, etc.) // Vous devez implémenter cette logique pour sauvegarder le code dans votre base de données $this->saveAuthorizationCode($authorizationCode, $this->getUser(), $callbackUrl); // Ajouter le code d'autorisation à l'URL de redirection $redirectUrl = sprintf('%s?code=%s&state=%s', $callbackUrl, $authorizationCode, $request->query->get('state')); return new RedirectResponse($redirectUrl); } // Obtenir l'erreur de connexion s'il y en a une $error = $authenticationUtils->getLastAuthenticationError(); $lastUsername = $authenticationUtils->getLastUsername(); return $this->render('security/login/oauth_login.html.twig', [ 'last_username' => $lastUsername, 'error' => $error, 'callback_url' => $callbackUrl, 'client_id' => $client_id ]); } /** * Créer une nouvelle instance de l'entité AuthorizationCode * @param string $code * @param Users $user * @param string $redirectUri * @param array $scopes * @return void */ private function saveAuthorizationCode(string $code, Users $user, string $redirectUri, array $scopes = []): void { $authorizationCode = new OAuthAuthorizationCode(); $authorizationCode->setCode($code); $authorizationCode->setUser($user); $authorizationCode->setRedirectUri($redirectUri); $authorizationCode->setScopes($scopes); $authorizationCode->setExpiresAt(new \DateTime('+10 minutes')); // Le code expire dans 10 minutes $this->em->persist($authorizationCode); $this->em->flush(); } public function logout(): void { throw new \Exception('This method can be blank - it will be intercepted by the logout key on your firewall'); }}