src/Controller/RegistrationController.php line 22

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Users;
  4. use App\Form\RegistrationFormType;
  5. use App\Repository\UsersRepository;
  6. use App\Security\UsersAuthenticator;
  7. use App\Service\JWTService;
  8. use App\Service\SendMailService;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
  16. class RegistrationController extends AbstractController
  17. {
  18.     #[Route('/inscription'name'app_register')]
  19.     public function register(Request $requestUserPasswordHasherInterface $userPasswordHasherUserAuthenticatorInterface $userAuthenticatorUsersAuthenticator $authenticatorEntityManagerInterface $entityManagerSendMailService $mailJWTService $jwt\Twig\Environment $twig): Response
  20.     {
  21.         $user = new Users();
  22.         $form $this->createForm(RegistrationFormType::class, $user);
  23.         $form->handleRequest($request);
  24.         if ($form->isSubmitted() && $form->isValid()) {
  25.             // encode the plain password
  26.             $user->setPassword(
  27.             $userPasswordHasher->hashPassword(
  28.                     $user,
  29.                     $form->get('plainPassword')->getData()
  30.                 )
  31.             );
  32.             $entityManager->persist($user);
  33.             $entityManager->flush();
  34.             // do anything else you need here, like send an email
  35.             // On génère le JWT de l'utilisateur
  36.             // On crée le Header
  37.             $header = [
  38.                 'typ' => 'JWT',
  39.                 'alg' => 'HS256'
  40.             ];
  41.             // On crée le Payload
  42.             $payload = [
  43.                 'user_id' => $user->getId()
  44.             ];
  45.             // On génère le token
  46.             $token $jwt->generate($header$payload$this->getParameter('app.jwtsecret'));
  47.             // On envoie un mail
  48.             // --- Rendu du template Twig pour le mail ---
  49.             $message $twig->render('emails/register.html.twig', [
  50.                 'user' => $user,
  51.                 'token' => $token
  52.             ]);
  53.             $this->sendEmail($user->getEmail(), $user->getEmail(),
  54.                 'Activation de votre compte sur le site',
  55.                 'no-reply@lelorrain.fr',
  56.                 'Le Lorrain',
  57.                 $message);
  58.             return $userAuthenticator->authenticateUser(
  59.                 $user,
  60.                 $authenticator,
  61.                 $request
  62.             );
  63.         }
  64.         return $this->render('registration/register.html.twig', [
  65.             'registrationForm' => $form->createView(),
  66.         ]);
  67.     }
  68.     private function sendEmail($to$toTxt$subject$from$fromTxt$message): bool
  69.     {
  70.         $apiKey 'a9b94b25be48de689d7bbef6386dbd19';
  71.         $apiSecret 'be54ed1f3e34a2e6dc6f8b01634f81d3';
  72.         $url 'https://api.mailjet.com/v3.1/send';
  73.         $data = [
  74.             'Messages' => [
  75.                 [
  76.                     'From' => [
  77.                         'Email' => $from,
  78.                         'Name' => $fromTxt
  79.                     ],
  80.                     'To' => [
  81.                         [
  82.                             'Email' => $to,
  83.                             'Name' => $toTxt
  84.                         ]
  85.                     ],
  86.                     'Subject' =>  $subject,
  87.                     'TextPart' => strip_tags($message),
  88.                     'HTMLPart' => $message,
  89.                 ]
  90.             ]
  91.         ];
  92.         $ch curl_init($url);
  93.         curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  94.         curl_setopt($chCURLOPT_HTTPAUTHCURLAUTH_BASIC);
  95.         curl_setopt($chCURLOPT_USERPWD$apiKey ':' $apiSecret);
  96.         curl_setopt($chCURLOPT_POSTtrue);
  97.         curl_setopt($chCURLOPT_POSTFIELDSjson_encode($data));
  98.         curl_setopt($chCURLOPT_HTTPHEADER, [
  99.             'Content-Type: application/json'
  100.         ]);
  101.         $response curl_exec($ch);
  102.         $httpCode curl_getinfo($chCURLINFO_HTTP_CODE);
  103.         curl_close($ch);
  104.         // Vérifie que la requête a réussi (code 200) et que le JSON est valide
  105.         if ($httpCode === 200 && $response) {
  106.             $responseData json_decode($responsetrue);
  107.             if (
  108.                 isset($responseData['Messages'][0]['Status']) &&
  109.                 $responseData['Messages'][0]['Status'] === 'success'
  110.             ) {
  111.                 return true;
  112.             }
  113.         }
  114.         return false;
  115.     }
  116.     #[Route('/verif/{token}'name'verify_user')]
  117.     public function verifyUser($tokenJWTService $jwtUsersRepository $usersRepositoryEntityManagerInterface $em): Response
  118.     {
  119.         //On vérifie si le token est valide, n'a pas expiré et n'a pas été modifié
  120.         if($jwt->isValid($token) && !$jwt->isExpired($token) && $jwt->check($token$this->getParameter('app.jwtsecret'))){
  121.             // On récupère le payload
  122.             $payload $jwt->getPayload($token);
  123.             // On récupère le user du token
  124.             $user $usersRepository->find($payload['user_id']);
  125.             //On vérifie que l'utilisateur existe et n'a pas encore activé son compte
  126.             if($user && !$user->getIsVerified()){
  127.                 $user->setIsVerified(true);
  128.                 $em->flush($user);
  129.                 $this->addFlash('success''Utilisateur activé');
  130.                 return $this->redirectToRoute('profile_index');
  131.             }
  132.         }
  133.         // Ici un problème se pose dans le token
  134.         $this->addFlash('danger''Le token est invalide ou a expiré');
  135.         return $this->redirectToRoute('app_login');
  136.     }
  137.     #[Route('/renvoiverif'name'resend_verif')]
  138.     public function resendVerif(JWTService $jwtSendMailService $mailUsersRepository $usersRepository): Response
  139.     {
  140.         $user $this->getUser();
  141.         if(!$user){
  142.             $this->addFlash('danger''Vous devez être connecté pour accéder à cette page');
  143.             return $this->redirectToRoute('app_login');
  144.         }
  145.         if($user->getIsVerified()){
  146.             $this->addFlash('warning''Cet utilisateur est déjà activé');
  147.             return $this->redirectToRoute('profile_index');
  148.         }
  149.         // On génère le JWT de l'utilisateur
  150.         // On crée le Header
  151.         $header = [
  152.             'typ' => 'JWT',
  153.             'alg' => 'HS256'
  154.         ];
  155.         // On crée le Payload
  156.         $payload = [
  157.             'user_id' => $user->getId()
  158.         ];
  159.         // On génère le token
  160.         $token $jwt->generate($header$payload$this->getParameter('app.jwtsecret'));
  161.         // On envoie un mail
  162.         $mail->send(
  163.             'no-reply@monsite.net',
  164.             $user->getEmail(),
  165.             'Activation de votre compte sur le site e-commerce',
  166.             'register',
  167.             compact('user''token')
  168.         );
  169.         $this->addFlash('success''Email de vérification envoyé');
  170.         return $this->redirectToRoute('profile_index');
  171.     }
  172. }