src/Controller/RegistrationController.php line 26

  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 Doctrine\ORM\EntityManagerInterface;
  9. use App\Service\SendMailService;
  10. use App\Service\SmtpChecker;
  11. use DateTimeImmutable;
  12. use Doctrine\ORM\EntityManager;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
  19. use Symfony\Contracts\Translation\TranslatorInterface;
  20. class RegistrationController extends AbstractController
  21. {
  22.     #[Route('/register', name: 'app_register')]
  23.     public function register(Request $request, UserPasswordHasherInterface $userPasswordHasher, 
  24.     UserAuthenticatorInterface $userAuthenticator, UsersAuthenticator $authenticator, 
  25.     EntityManagerInterface $entityManager, SendMailService $mail, JWTService $jwt, 
  26.     SmtpChecker $smtpChecker): Response
  27.     {
  28.         $user = new Users();
  29.         $form = $this->createForm(RegistrationFormType::class, $user);
  30.         $form->handleRequest($request);
  31.         if ($form->isSubmitted() && $form->isValid()) {
  32.             // encode the plain password
  33.             $user->setPassword(
  34.                 $userPasswordHasher->hashPassword(
  35.                     $user,
  36.                     $form->get('plainPassword')->getData()
  37.                 )
  38.             );
  39.             $entityManager->persist($user);
  40.             $entityManager->flush();
  41.             
  42.             // do anything else you need here, like send an email
  43.             // On vérifie la connexion avec le seveur SMTP grâce au service SmtpChecker
  44.             if ($smtpChecker->checkConnection()) {
  45.                 // On génère le JWT de l'utilisateur 
  46.                 // On crée le header
  47.                 $header = [
  48.                     'typ' => 'JWT',
  49.                     'alg' => 'HS256'
  50.                 ];
  51.     
  52.                 // On crée le Payload
  53.                 $payload = [
  54.                     'user_id' => $user->getId()
  55.                 ];
  56.     
  57.                 // On génère le token
  58.                 $token = $jwt->generate($header, $payload, $this->getParameter('app.jwtsecret'));
  59.     
  60.                 // On envoie un mail
  61.                 $mail->send(
  62.                     'no-reply@mon-site.net',
  63.                     $user->getEmail(),
  64.                     'Activation de votre compte sur le site e-commerce',
  65.                     'register',
  66.                     // compact() Crée un tableau avec le contenu de user à l'intérieur
  67.                     compact('user', 'token')
  68.                 );
  69.             }
  70.             return $userAuthenticator->authenticateUser(
  71.                 $user,
  72.                 $authenticator,
  73.                 $request
  74.             );
  75.         }
  76.         return $this->render('registration/register.html.twig', [
  77.             'registrationForm' => $form->createView()
  78.         ]);
  79.     }
  80.     #[Route('/verif/{token}', name: 'verify_user')]
  81.     public function verifyUser($token, JWTService $jwt, UsersRepository $usersRepository, EntityManagerInterface $em): Response
  82.     {
  83.         // On vérifie si le token est valide, n'a pas expiré et n'a pas été modifié.
  84.         if ($jwt->isValid($token) && !$jwt->isExpired($token) && $jwt->check($token, $this->getParameter('app.jwtsecret'))) {
  85.             // On récupère le payload
  86.             $payload = $jwt->getPayload($token);
  87.             // On récupère le user du token
  88.             $user = $usersRepository->find($payload['user_id']);
  89.             // On vérifie que l'utilisateur existe et n'a pas encore activé son compte
  90.             if ($user && !$user->getIsVerified()) {
  91.                 $user->setIsVerified(true);
  92.                 $em->flush($user);
  93.                 $this->addFlash('success', 'Utilisateur activé');
  94.                 return $this->redirectToRoute('profile_index');
  95.             }
  96.         }
  97.         // Ici un problème se pose dans le token
  98.         $this->addFlash('danger', 'Le token est invalide ou a expiré');
  99.         return $this->redirectToRoute('app_login');
  100.     }
  101.     #[Route('/renvoiverif', name: 'resend_verif')]
  102.     public function resendVerif(JWTService $jwt, SendMailService $mail, UsersRepository $usersRepository): Response
  103.     {
  104.         $user = $this->getUser();
  105.         if (!$user) {
  106.             $this->addFlash('danger', 'Vous devez être connecté pour accéder à cette page');
  107.             return $this->redirectToRoute('app_login');
  108.         }
  109.         if ($user->getIsVerified()) {
  110.             $this->addFlash('warning', 'Cet utilisateur est déjà activé');
  111.             return $this->redirectToRoute('profile_index');
  112.         }
  113.         // On génère le JWT de l'utilisateur 
  114.         // On crée le header
  115.         $header = [
  116.             'typ' => 'JWT',
  117.             'alg' => 'HS256'
  118.         ];
  119.         // On crée le Payload
  120.         $payload = [
  121.             'user_id' => $user->getId()
  122.         ];
  123.         // On génère le token
  124.         $token = $jwt->generate($header, $payload, $this->getParameter('app.jwtsecret'));
  125.         // On envoie un mail
  126.         $mail->send(
  127.             'no-reply@mon-site.net',
  128.             $user->getEmail(),
  129.             'Activation de votre compte sur le site e-commerce',
  130.             'register',
  131.             // compact() Crée un tableau avec le contenu de user à l'intérieur
  132.             compact('user', 'token')
  133.         ); 
  134.         $this->addFlash('success', 'Email de vérification envoyé');
  135.         return $this->redirectToRoute('profile_index');
  136.     }
  137. }