<?php
namespace App\Controller;
use App\Service\GoogleOAuthService;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Psr\Log\LoggerInterface;
use App\Entity\Entity;
use Doctrine\ORM\EntityManagerInterface;
class GoogleController
{
private $googleOAuthService;
private $entityManager;
public function __construct(GoogleOAuthService $googleOAuthService, EntityManagerInterface $entityManager)
{
$this->googleOAuthService = $googleOAuthService;
$this->entityManager = $entityManager;
}
#[Route('/google/login', name: 'google_login')]
public function login(): RedirectResponse
{
$authUrl = $this->googleOAuthService->getAuthorizationUrl();
return new RedirectResponse($authUrl);
}
#[Route('/google/callback', name: 'google_callback')]
public function callback(Request $request, SessionInterface $session, LoggerInterface $logger): Response
{
$session = $request->getSession(); // Récupération de la session
$storedState = $session->get('oauth2state');
$state = $request->get('state');
$logger->info('State reçu', ['state' => $state]);
$logger->info('State attendu', ['storedState' => $storedState]);
if (!$state || $state !== $storedState) {
return new Response('Invalid state', Response::HTTP_FORBIDDEN);
}
try {
$accessToken = $this->googleOAuthService->getAccessToken($request->get('code'));
$googleUser = $this->googleOAuthService->getUserInfo($accessToken);
// Récupérer ou créer un utilisateur
$user = $this->entityManager->getRepository(Entity::class)
->findOneBy(['googleId' => $googleUser['id']]);
if (!$user) {
// if email already exists
$user = $this->entityManager->getRepository(Entity::class)
->findOneBy(['email' => $googleUser['email']]);
if ($user) {
$user->setGoogleID($googleUser['id']);
$this->entityManager->flush();
} else {
$pwd = bin2hex(random_bytes(16));
$user = new Entity();
$user->setGoogleID($googleUser['id']);
$user->setEmail($googleUser['email']);
$user->setName($googleUser['name']);
$user->setPassword($pwd);
$this->entityManager->persist($user);
$this->entityManager->flush();
}
}
/*
// Générer un JWT
$token = $this->jwtManager->create($user);
return new JsonResponse(['token' => $token, 'user' => $user->getEmail()]);
// Connecter l'utilisateur
return $authenticator->authenticateUser($user, $formAuthenticator, $request);
*/
} catch (\Exception $e) {
return new RedirectResponse('/login?error=' . urlencode($e->getMessage()));
}
}
}