src/Controller/OAuth2/LoginController.php line 36

Open in your IDE?
  1. <?php
  2. namespace App\Controller\OAuth2;
  3. use App\Entity\Core\OAuthAuthorizationCode;
  4. use App\Entity\Core\Users;
  5. use App\Services\Core\Core;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
  8. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  9. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  12. use Symfony\Component\HttpFoundation\Cookie;
  13. use Symfony\Component\HttpFoundation\JsonResponse;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  18. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  19. use Symfony\Component\HttpFoundation\RedirectResponse;
  20. class LoginController extends AbstractController
  21. {
  22.     private $authenticationUtils;
  23.     private $em;
  24.     public function __construct(AuthenticationUtils $authenticationUtils,
  25.                                 EntityManagerInterface $em
  26.     ) {
  27.         $this->authenticationUtils $authenticationUtils;
  28.         $this->em $em;
  29.     }
  30.     public function login(AuthenticationUtils $authenticationUtilsRequest $request): Response
  31.     {
  32.         // Obtenir l'URL de callback depuis les paramètres de requête
  33.         $callbackUrl $request->query->get('redirect_uri');
  34.         $client_id $request->query->get('client_id');
  35.         // Si l'utilisateur est déjà authentifié, générer un code d'autorisation et rediriger vers l'URL de callback
  36.         if ($this->getUser()) {
  37.             // Générer un code d'autorisation (ou un token directement selon votre flux)
  38.             $authorizationCode bin2hex(random_bytes(16)); // Par exemple, générer un code aléatoire
  39.             // Stocker le code d'autorisation avec les détails nécessaires (utilisateur, client, scopes, etc.)
  40.             // Vous devez implémenter cette logique pour sauvegarder le code dans votre base de données
  41.             $this->saveAuthorizationCode($authorizationCode$this->getUser(), $callbackUrl);
  42.             // Ajouter le code d'autorisation à l'URL de redirection
  43.             $redirectUrl sprintf('%s?code=%s&state=%s'$callbackUrl$authorizationCode$request->query->get('state'));
  44.             return new RedirectResponse($redirectUrl);
  45.         }
  46.         // Obtenir l'erreur de connexion s'il y en a une
  47.         $error $authenticationUtils->getLastAuthenticationError();
  48.         $lastUsername $authenticationUtils->getLastUsername();
  49.         return $this->render('security/login/oauth_login.html.twig', [
  50.             'last_username' => $lastUsername,
  51.             'error' => $error,
  52.             'callback_url' => $callbackUrl,
  53.             'client_id' => $client_id
  54.         ]);
  55.     }
  56.     /**
  57.      * Créer une nouvelle instance de l'entité AuthorizationCode
  58.      * @param string $code
  59.      * @param Users $user
  60.      * @param string $redirectUri
  61.      * @param array $scopes
  62.      * @return void
  63.      */
  64.     private function saveAuthorizationCode(string $codeUsers $userstring $redirectUri, array $scopes = []): void
  65.     {
  66.         $authorizationCode = new OAuthAuthorizationCode();
  67.         $authorizationCode->setCode($code);
  68.         $authorizationCode->setUser($user);
  69.         $authorizationCode->setRedirectUri($redirectUri);
  70.         $authorizationCode->setScopes($scopes);
  71.         $authorizationCode->setExpiresAt(new \DateTime('+10 minutes')); // Le code expire dans 10 minutes
  72.         $this->em->persist($authorizationCode);
  73.         $this->em->flush();
  74.     }
  75.     public function logout(): void
  76.     {
  77.         throw new \Exception('This method can be blank - it will be intercepted by the logout key on your firewall');
  78.     }
  79. }