src/Controller/GoogleController.php line 36

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Service\GoogleOAuthService;
  4. use Symfony\Component\HttpFoundation\RedirectResponse;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\Routing\Annotation\Route;
  8. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  9. use Psr\Log\LoggerInterface;
  10. use App\Entity\Entity;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. class GoogleController
  13. {
  14.     private $googleOAuthService;
  15.     private $entityManager;
  16.     public function __construct(GoogleOAuthService $googleOAuthServiceEntityManagerInterface $entityManager)
  17.     {
  18.         $this->googleOAuthService $googleOAuthService;
  19.         $this->entityManager $entityManager;
  20.     }
  21.     #[Route('/google/login'name'google_login')]
  22.     public function login(): RedirectResponse
  23.     {
  24.         $authUrl $this->googleOAuthService->getAuthorizationUrl();
  25.         return new RedirectResponse($authUrl);
  26.     }
  27.     #[Route('/google/callback'name'google_callback')]
  28.     public function callback(Request $requestSessionInterface $sessionLoggerInterface $logger): Response
  29.     {
  30.         $session $request->getSession(); // Récupération de la session
  31.         $storedState $session->get('oauth2state');
  32.         $state $request->get('state');
  33.         $logger->info('State reçu', ['state' => $state]);
  34.         $logger->info('State attendu', ['storedState' => $storedState]);
  35.         if (!$state || $state !== $storedState) {
  36.             return new Response('Invalid state'Response::HTTP_FORBIDDEN);
  37.         }
  38.         try {
  39.             $accessToken $this->googleOAuthService->getAccessToken($request->get('code'));
  40.             $googleUser $this->googleOAuthService->getUserInfo($accessToken);
  41.             // Récupérer ou créer un utilisateur
  42.             $user $this->entityManager->getRepository(Entity::class)
  43.                 ->findOneBy(['googleId' => $googleUser['id']]);
  44.             if (!$user) {
  45.                 // if email already exists 
  46.                 $user $this->entityManager->getRepository(Entity::class)
  47.                     ->findOneBy(['email' => $googleUser['email']]);
  48.                 if ($user) {
  49.                     $user->setGoogleID($googleUser['id']);
  50.                     $this->entityManager->flush();
  51.                 } else {
  52.                     $pwd bin2hex(random_bytes(16));
  53.                     $user = new Entity();
  54.                     $user->setGoogleID($googleUser['id']);
  55.                     $user->setEmail($googleUser['email']);
  56.                     $user->setName($googleUser['name']);
  57.                     $user->setPassword($pwd);
  58.                     $this->entityManager->persist($user);
  59.                     $this->entityManager->flush();
  60.                 }
  61.             }
  62.             /*
  63.             // Générer un JWT
  64.             $token = $this->jwtManager->create($user);
  65.             return new JsonResponse(['token' => $token, 'user' => $user->getEmail()]);
  66.             // Connecter l'utilisateur
  67.             return $authenticator->authenticateUser($user, $formAuthenticator, $request);
  68.             */
  69.         } catch (\Exception $e) {
  70.             return new RedirectResponse('/login?error=' urlencode($e->getMessage()));
  71.         }
  72.     }
  73. }