src/Controller/AuthController.php line 40

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use League\OAuth2\Client\Provider\Google; // Utilisation du bon namespace
  8. use Symfony\Component\HttpFoundation\Request;
  9. use App\Entity\User;
  10. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  11. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  12. use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
  13. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  14. use App\Service\ManageurMailer;
  15. class AuthController extends AbstractController
  16. {
  17.     private $manageurMailer;
  18.     public function __construct(ManageurMailer $manageurMailer)
  19.     {
  20.         $this->manageurMailer = $manageurMailer;
  21.     }
  22.     /**
  23.      * @Route("/authgoogle", name="app_auth_go")
  24.      */
  25.     public function index(): Response
  26.     {
  27.         return $this->render('auth/register.html.twig', [
  28.             'controller_name' => 'AuthController',
  29.         ]);
  30.     }
  31.     /**
  32.      * @Route("/login/google", name="google_auth")
  33.      */
  34.     public function redirectToGoogle(): RedirectResponse
  35.     {
  36.         $googleProvider = new Google([
  37.             'clientId'     => '585729122202-pls5r9gfqtjpd3244e0a8rcu16rg302s.apps.googleusercontent.com',
  38.             'clientSecret' => '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',
  39.             'redirectUri'  => 'https://www.mazego.fr/login/google/callback',
  40.         ]);
  41.         $url = $googleProvider->getAuthorizationUrl();
  42.         return $this->redirect($url);
  43.     }
  44.     /**
  45.      * @Route("/login/google/callback", name="google_auth_callback")
  46.      */
  47.     public function handleGoogleCallback(
  48.         Request $request,
  49.         UserPasswordEncoderInterface $passwordEncoder,
  50.         TokenStorageInterface $tokenStorage,
  51.         AuthenticationManagerInterface $authenticationManager
  52.     ): Response {
  53.         $googleProvider = new Google([
  54.             'clientId'     => '585729122202-pls5r9gfqtjpd3244e0a8rcu16rg302s.apps.googleusercontent.com',
  55.             'clientSecret' => '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',
  56.             'redirectUri'  => 'https://www.mazego.fr/login/google/callback',
  57.         ]);
  58.         // Récupérer le code d'autorisation depuis la requête
  59.         $code = $request->query->get('code');
  60.         // Vérifier si le code d'autorisation est présent
  61.         if (!$code) {
  62.             return $this->redirectToRoute('error_page');
  63.         }
  64.         // Utiliser le code d'autorisation pour obtenir le jeton d'accès OAuth
  65.         $accessToken = $googleProvider->getAccessToken('authorization_code', ['code' => $code]);
  66.         // Récupérer les informations de l'utilisateur depuis Google en utilisant le jeton d'accès
  67.         $googleUser = $googleProvider->getResourceOwner($accessToken);
  68.         $userData = $googleUser->toArray();
  69.         // Récupérer l'adresse e-mail de l'utilisateur depuis les données Google
  70.         $email = $userData['email'] ?? null;
  71.         if (!$email) {
  72.             return $this->redirectToRoute('a_propos');
  73.         }
  74.         // Vérifier si l'utilisateur existe déjà dans la base de données de Mazego
  75.         $userRepository = $this->getDoctrine()->getRepository(User::class);
  76.         $user = $userRepository->findOneBy(['email' => $email]);
  77.         if (!$user) {
  78.             $firstName = $userData['given_name'] ?? 'manquant';
  79.             $lastName = $userData['family_name'] ?? 'manquant';
  80.             // Si l'utilisateur n'existe pas encore, créez un nouveau compte utilisateur
  81.             $user = new User();
  82.             $user->setFirstname($firstName);
  83.             $user->setLastname($lastName);
  84.             $user->setCategorie('ENTREPRENEUR');
  85.             $user->setEmail($email);
  86.             $user->setRoles(["ROLE_ENTREPRENEUR"]);
  87.             // Générez un mot de passe aléatoire
  88.             $password = bin2hex(random_bytes(10));
  89.             $user->setPassword($passwordEncoder->encodePassword($user, $password));
  90.             // Enregistrez le nouvel utilisateur dans la base de données
  91.             $entityManager = $this->getDoctrine()->getManager();
  92.             $entityManager->persist($user);
  93.             $entityManager->flush();
  94.         }
  95.         // Authentifier l'utilisateur dans Symfony
  96.         $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
  97.         $authenticatedToken = $authenticationManager->authenticate($token);
  98.         $tokenStorage->setToken($authenticatedToken);
  99.         // Envoyer un e-mail de notification
  100.         $this->manageurMailer->sendMailRegister("mazego.fr@gmail.com", $user->getFirstname(), $user->getLastname(), "Nouvelle connexion sur le site mazego.fr");
  101.         // Rediriger l'utilisateur vers la page d'accueil ou toute autre page appropriée
  102.         return $this->redirectToRoute('dashboard');
  103.     }
  104. }