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): 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.            // dd($token);
  48.             // On envoie un mail
  49.             $mail->send(
  50.                 'no-reply@monsite.net',
  51.                 $user->getEmail(),
  52.                 'Activation de votre compte sur le site e-commerce',
  53.                 'register',
  54.                 compact('user''token')
  55.             );
  56.             return $userAuthenticator->authenticateUser(
  57.                 $user,
  58.                 $authenticator,
  59.                 $request
  60.             );
  61.         }
  62.         return $this->render('registration/register.html.twig', [
  63.             'registrationForm' => $form->createView(),
  64.         ]);
  65.     }
  66.     #[Route('/verif/{token}'name'verify_user')]
  67.     public function verifyUser($tokenJWTService $jwtUsersRepository $usersRepositoryEntityManagerInterface $em): Response
  68.     {
  69.         //On vérifie si le token est valide, n'a pas expiré et n'a pas été modifié
  70.         if($jwt->isValid($token) && !$jwt->isExpired($token) && $jwt->check($token$this->getParameter('app.jwtsecret'))){
  71.             // On récupère le payload
  72.             $payload $jwt->getPayload($token);
  73.             // On récupère le user du token
  74.             $user $usersRepository->find($payload['user_id']);
  75.             //On vérifie que l'utilisateur existe et n'a pas encore activé son compte
  76.             if($user && !$user->getIsVerified()){
  77.                 $user->setIsVerified(true);
  78.                 $em->flush($user);
  79.                 $this->addFlash('success''Utilisateur activé');
  80.                 return $this->redirectToRoute('profile_index');
  81.             }
  82.         }
  83.         // Ici un problème se pose dans le token
  84.         $this->addFlash('danger''Le token est invalide ou a expiré');
  85.         return $this->redirectToRoute('app_login');
  86.     }
  87.     #[Route('/renvoiverif'name'resend_verif')]
  88.     public function resendVerif(JWTService $jwtSendMailService $mailUsersRepository $usersRepository): Response
  89.     {
  90.         $user $this->getUser();
  91.         if(!$user){
  92.             $this->addFlash('danger''Vous devez être connecté pour accéder à cette page');
  93.             return $this->redirectToRoute('app_login');    
  94.         }
  95.         if($user->getIsVerified()){
  96.             $this->addFlash('warning''Cet utilisateur est déjà activé');
  97.             return $this->redirectToRoute('profile_index');    
  98.         }
  99.         // On génère le JWT de l'utilisateur
  100.         // On crée le Header
  101.         $header = [
  102.             'typ' => 'JWT',
  103.             'alg' => 'HS256'
  104.         ];
  105.         // On crée le Payload
  106.         $payload = [
  107.             'user_id' => $user->getId()
  108.         ];
  109.         // On génère le token
  110.         $token $jwt->generate($header$payload$this->getParameter('app.jwtsecret'));
  111.         // On envoie un mail
  112.         $mail->send(
  113.             'no-reply@monsite.net',
  114.             $user->getEmail(),
  115.             'Activation de votre compte sur le site e-commerce',
  116.             'register',
  117.             compact('user''token')
  118.         );
  119.         $this->addFlash('success''Email de vérification envoyé');
  120.         return $this->redirectToRoute('profile_index');
  121.     }
  122. }