<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\RedirectResponse;
use League\OAuth2\Client\Provider\Google; // Utilisation du bon namespace
use Symfony\Component\HttpFoundation\Request;
use App\Entity\User;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use App\Service\ManageurMailer;
class AuthController extends AbstractController
{
private $manageurMailer;
public function __construct(ManageurMailer $manageurMailer)
{
$this->manageurMailer = $manageurMailer;
}
/**
* @Route("/authgoogle", name="app_auth_go")
*/
public function index(): Response
{
return $this->render('auth/register.html.twig', [
'controller_name' => 'AuthController',
]);
}
/**
* @Route("/login/google", name="google_auth")
*/
public function redirectToGoogle(): RedirectResponse
{
$googleProvider = new Google([
'clientId' => '585729122202-pls5r9gfqtjpd3244e0a8rcu16rg302s.apps.googleusercontent.com',
'clientSecret' => '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',
'redirectUri' => 'https://www.mazego.fr/login/google/callback',
]);
$url = $googleProvider->getAuthorizationUrl();
return $this->redirect($url);
}
/**
* @Route("/login/google/callback", name="google_auth_callback")
*/
public function handleGoogleCallback(
Request $request,
UserPasswordEncoderInterface $passwordEncoder,
TokenStorageInterface $tokenStorage,
AuthenticationManagerInterface $authenticationManager
): Response {
$googleProvider = new Google([
'clientId' => '585729122202-pls5r9gfqtjpd3244e0a8rcu16rg302s.apps.googleusercontent.com',
'clientSecret' => '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',
'redirectUri' => 'https://www.mazego.fr/login/google/callback',
]);
// Récupérer le code d'autorisation depuis la requête
$code = $request->query->get('code');
// Vérifier si le code d'autorisation est présent
if (!$code) {
return $this->redirectToRoute('error_page');
}
// Utiliser le code d'autorisation pour obtenir le jeton d'accès OAuth
$accessToken = $googleProvider->getAccessToken('authorization_code', ['code' => $code]);
// Récupérer les informations de l'utilisateur depuis Google en utilisant le jeton d'accès
$googleUser = $googleProvider->getResourceOwner($accessToken);
$userData = $googleUser->toArray();
// Récupérer l'adresse e-mail de l'utilisateur depuis les données Google
$email = $userData['email'] ?? null;
if (!$email) {
return $this->redirectToRoute('a_propos');
}
// Vérifier si l'utilisateur existe déjà dans la base de données de Mazego
$userRepository = $this->getDoctrine()->getRepository(User::class);
$user = $userRepository->findOneBy(['email' => $email]);
if (!$user) {
$firstName = $userData['given_name'] ?? 'manquant';
$lastName = $userData['family_name'] ?? 'manquant';
// Si l'utilisateur n'existe pas encore, créez un nouveau compte utilisateur
$user = new User();
$user->setFirstname($firstName);
$user->setLastname($lastName);
$user->setCategorie('ENTREPRENEUR');
$user->setEmail($email);
$user->setRoles(["ROLE_ENTREPRENEUR"]);
// Générez un mot de passe aléatoire
$password = bin2hex(random_bytes(10));
$user->setPassword($passwordEncoder->encodePassword($user, $password));
// Enregistrez le nouvel utilisateur dans la base de données
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($user);
$entityManager->flush();
}
// Authentifier l'utilisateur dans Symfony
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$authenticatedToken = $authenticationManager->authenticate($token);
$tokenStorage->setToken($authenticatedToken);
// Envoyer un e-mail de notification
$this->manageurMailer->sendMailRegister("mazego.fr@gmail.com", $user->getFirstname(), $user->getLastname(), "Nouvelle connexion sur le site mazego.fr");
// Rediriger l'utilisateur vers la page d'accueil ou toute autre page appropriée
return $this->redirectToRoute('dashboard');
}
}