request->get('email'); // Vérifier si l'email est valide if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $this->addFlash('error', 'Adresse e-mail invalide.'); return $this->redirectToRoute('app_login'); } // Générer un token unique $token = bin2hex(random_bytes(32)); // Enregistrer le token dans la base de données $passwordResetToken = new PasswordResetToken(); $passwordResetToken->setToken($token) ->setEmail($email) ->setCreatedAt(new \DateTime()); $entityManager->persist($passwordResetToken); $entityManager->flush(); // Générer un lien de réinitialisation $resetLink = $urlGenerator->generate( 'app_password_reset', ['token' => $token], UrlGeneratorInterface::ABSOLUTE_URL ); // Envoyer l'email avec le lien $email = (new Email()) ->from('contact@sortir.com') ->to($email) ->subject('Sortir.com | Réinitialisation de mot de passe') ->html("
Bonjour,
Vous avez demandé une réinitialisation de mot de passe. Cliquez sur le lien ci-dessous pour réinitialiser votre mot de passe :
Réinitialiser mon mot de passe
Ce lien est valable 24 heures.
"); $mailer->send($email); $this->addFlash('success', 'Un email de réinitialisation a été envoyé.'); return $this->redirectToRoute('app_login'); }catch (TransportExceptionInterface|RandomException $e){ $this->addFlash('error', 'Erreur : ' . $e->getMessage()); return $this->redirectToRoute('app_login'); } } #[Route('/password/reset/{token}', name: 'app_password_reset', methods: ['GET', 'POST'])] public function resetPassword( string $token, Request $request, EntityManagerInterface $entityManager, ): Response { // Vérifier si le token existe $repository = $entityManager->getRepository(PasswordResetToken::class); $passwordResetToken = $repository->findOneBy(['token' => $token]); if (!$passwordResetToken || $passwordResetToken->isExpired()) { $this->addFlash('error', 'Ce lien de réinitialisation est invalide ou expiré.'); return $this->redirectToRoute('app_login'); } // Si la requête est POST, traiter le nouveau mot de passe if ($request->isMethod('POST')) { $newPassword = $request->request->get('password'); $newPasswordConfirm = $request->request->get('passwordConfirm'); if ($newPassword.equalTo($newPasswordConfirm)) { $this->addFlash('error', 'Les mots de passe ne correspondent pas.'); return $this->redirectToRoute('app_password_reset', ['token' => $token]); } if (strlen($newPassword) < 6) { $this->addFlash('error', 'Le mot de passe doit contenir au moins 6 caractères.'); return $this->redirectToRoute('app_password_reset', ['token' => $token]); } // Récupérer l'utilisateur et mettre à jour le mot de passe $user = $entityManager->getRepository(Participant::class)->findOneBy(['email' => $passwordResetToken->getEmail()]); $user->setPassword(password_hash($newPassword, PASSWORD_BCRYPT)); $entityManager->remove($passwordResetToken); // Supprimer le token $entityManager->flush(); $this->addFlash('success', 'Votre mot de passe a été mis à jour.'); return $this->redirectToRoute('app_login'); } return $this->render('password_reset/index.html.twig', ['token' => $token]); } }