<?php
namespace App\Controller;
use App\Entity\Users;
use App\Form\RegistrationFormType;
use App\Repository\UsersRepository;
use App\Security\UsersAuthenticator;
use App\Service\JWTService;
use App\Service\SendMailService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
class RegistrationController extends AbstractController
{
#[Route('/inscription', name: 'app_register')]
public function register(Request $request, UserPasswordHasherInterface $userPasswordHasher, UserAuthenticatorInterface $userAuthenticator, UsersAuthenticator $authenticator, EntityManagerInterface $entityManager, SendMailService $mail, JWTService $jwt, \Twig\Environment $twig): Response
{
$user = new Users();
$form = $this->createForm(RegistrationFormType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// encode the plain password
$user->setPassword(
$userPasswordHasher->hashPassword(
$user,
$form->get('plainPassword')->getData()
)
);
$entityManager->persist($user);
$entityManager->flush();
// do anything else you need here, like send an email
// On génère le JWT de l'utilisateur
// On crée le Header
$header = [
'typ' => 'JWT',
'alg' => 'HS256'
];
// On crée le Payload
$payload = [
'user_id' => $user->getId()
];
// On génère le token
$token = $jwt->generate($header, $payload, $this->getParameter('app.jwtsecret'));
// On envoie un mail
// --- Rendu du template Twig pour le mail ---
$message = $twig->render('emails/register.html.twig', [
'user' => $user,
'token' => $token
]);
$this->sendEmail($user->getEmail(), $user->getEmail(),
'Activation de votre compte sur le site',
'no-reply@lelorrain.fr',
'Le Lorrain',
$message);
return $userAuthenticator->authenticateUser(
$user,
$authenticator,
$request
);
}
return $this->render('registration/register.html.twig', [
'registrationForm' => $form->createView(),
]);
}
private function sendEmail($to, $toTxt, $subject, $from, $fromTxt, $message): bool
{
$apiKey = 'a9b94b25be48de689d7bbef6386dbd19';
$apiSecret = 'be54ed1f3e34a2e6dc6f8b01634f81d3';
$url = 'https://api.mailjet.com/v3.1/send';
$data = [
'Messages' => [
[
'From' => [
'Email' => $from,
'Name' => $fromTxt
],
'To' => [
[
'Email' => $to,
'Name' => $toTxt
]
],
'Subject' => $subject,
'TextPart' => strip_tags($message),
'HTMLPart' => $message,
]
]
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, $apiKey . ':' . $apiSecret);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json'
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// Vérifie que la requête a réussi (code 200) et que le JSON est valide
if ($httpCode === 200 && $response) {
$responseData = json_decode($response, true);
if (
isset($responseData['Messages'][0]['Status']) &&
$responseData['Messages'][0]['Status'] === 'success'
) {
return true;
}
}
return false;
}
#[Route('/verif/{token}', name: 'verify_user')]
public function verifyUser($token, JWTService $jwt, UsersRepository $usersRepository, EntityManagerInterface $em): Response
{
//On vérifie si le token est valide, n'a pas expiré et n'a pas été modifié
if($jwt->isValid($token) && !$jwt->isExpired($token) && $jwt->check($token, $this->getParameter('app.jwtsecret'))){
// On récupère le payload
$payload = $jwt->getPayload($token);
// On récupère le user du token
$user = $usersRepository->find($payload['user_id']);
//On vérifie que l'utilisateur existe et n'a pas encore activé son compte
if($user && !$user->getIsVerified()){
$user->setIsVerified(true);
$em->flush($user);
$this->addFlash('success', 'Utilisateur activé');
return $this->redirectToRoute('profile_index');
}
}
// Ici un problème se pose dans le token
$this->addFlash('danger', 'Le token est invalide ou a expiré');
return $this->redirectToRoute('app_login');
}
#[Route('/renvoiverif', name: 'resend_verif')]
public function resendVerif(JWTService $jwt, SendMailService $mail, UsersRepository $usersRepository): Response
{
$user = $this->getUser();
if(!$user){
$this->addFlash('danger', 'Vous devez être connecté pour accéder à cette page');
return $this->redirectToRoute('app_login');
}
if($user->getIsVerified()){
$this->addFlash('warning', 'Cet utilisateur est déjà activé');
return $this->redirectToRoute('profile_index');
}
// On génère le JWT de l'utilisateur
// On crée le Header
$header = [
'typ' => 'JWT',
'alg' => 'HS256'
];
// On crée le Payload
$payload = [
'user_id' => $user->getId()
];
// On génère le token
$token = $jwt->generate($header, $payload, $this->getParameter('app.jwtsecret'));
// On envoie un mail
$mail->send(
'no-reply@monsite.net',
$user->getEmail(),
'Activation de votre compte sur le site e-commerce',
'register',
compact('user', 'token')
);
$this->addFlash('success', 'Email de vérification envoyé');
return $this->redirectToRoute('profile_index');
}
}