Mot de passe oublié

Lynx54 - Modifié le 1 févr. 2022 à 11:40
 Lynx54 - 16 févr. 2022 à 19:50
Bonjour,

Besoin d'aide please, j'aimerai proposer à mes users la possibilité de réinitialiser leur mot de passe en cas d'oubli de celui-ci! Mais je bloque un peu, ce que je souhaiterai, c'est qu'en indiquant l'adresse mail, et si celle-ci est en rapport l'id de l'article qu'ils puissent avoir un mail avec un lien sur lequel cliquer et redéfinir directement un nouveau mot de passe.
HTML
<form method="post">
    <input type="email" name="init_mail" placeholder="Votre e-mail" required /><br>
 <button type="submit" name="init" >Réinitialiser></button>
</form>


PHP
if(isset($_POST['init']))
{
 if(!empty($_POST['init_mail'])) {
   $recup_mail = htmlspecialchars($_POST['init_mail']);
   
   
   $mailexist = $con->prepare('SELECT email FROM table WHERE id = '.$id.' AND email = ?');
          $mailexist->execute(array($recup_mail));
          $mailexist_count = $mailexist->rowCount();
    
    if($mailexist_count == 1) {
             $pseudo = $mailexist->fetch();
             $pseudo = $eemail['email'];
             
             $_SESSION['recup_mail'] = $recup_mail;
             $recup_code = "";
             for($i=0; $i < 8; $i++) { 
                $recup_code .= mt_rand(0,9);
             }
    }
 }
 
 }


Merci

5 réponses

dysorthographie Messages postés 93 Date d'inscription jeudi 27 janvier 2022 Statut Membre Dernière intervention 3 mai 2024 5
7 févr. 2022 à 06:31
Bonjour,
Pourquoi ne pas lui envoyer un mot de passe provisoire via un générateur de mot de passe !

Dans le mail tu précises qu'ils est préférable de le modifier après connexion !
0
Bonjour,

J'y ai pensé mais je reste sur mon idée de jeton avec lien, la première phase est ok !
Je génère le token et la date de la demande j'enregistre et l'envoi du mail avec le lien cliquable est ok aussi.

Par contre en cliquant sur le lien de réinitialisation
monsite.fr/reinitialisation,token=1234&id=1

Je n'arrive pas à updater mon mot de passe sur la bdd

mon formulaire
<form class="row" method="post" action="reinitialisation-mot-de-passe.php?token=<?php echo $_GET['token'];?>&id=<?php echo $id;?>">

                                    
                                    
                                    <div class="col-md-6 col-sm-12">
                                       <div class="form-group">
                                          <label>Nouveau mot de passe <span class="required">*</span></label>
                                          <input type="password" placeholder="" name="password" class="form-control" required>
                                       </div>
                                    </div>
                                    
                                    <div class="col-md-6 col-sm-12">
                                       <div class="form-group">
                                          <label>Confirmer mot de passe</label>
                                          <input type="password" placeholder="" name="password_confirm" >
                                       </div>
                                    </div>

<button type="submit" name="refresh" class="btn btn-default pull-right"> Réinitialiser <i class="fa fa-refresh"></i></button>
                    </form>



Mon php
$query = $con->prepare('SELECT password_recovery_asked_date FROM matable WHERE password_recovery_token = ? AND id_annonce = ?');
$query->bindValue(1, $_GET['token']);
$query->bindValue(2, $_GET['id']);
$query->execute();
 
$row = $query->fetch(PDO::FETCH_ASSOC);

if (empty($row)) { 
 echo 'Ce token n\'a pas été trouvé';
 exit;
}


// On calcul la date de la génération du token + 3hrs
$tokenDate = strtotime('+3 hours', strtotime($row['password_recovery_asked_date']));
$todayDate = time();
 
if ($dateToken < $dateToday) { // Si la date est dépassé le délais de 3hrs
 echo 'Token expiré !';
 exit;
}

if (isset($_POST['refresh'])) { // Si le formulaire a été soumis
 if (!empty($_POST['password']) && !empty($_POST['password_confirm'])) { // Si le formulaire est correctement remplit
  if ($_POST['password'] == $_POST['password_confirm']) { // Si les deux mots de passes sont les mêmes
   // On hash le mot de passe
   $password = password_hash($_POST["password"], PASSWORD_BCRYPT);
   
 
   // On modifie les informations dans la base de données
   $query = $con->prepare('UPDATE matable SET m2p = ?, password_recovery_token = "" WHERE id_annonce = '.$id.'');
   $query->binValue(1, $password);
   $query->binValue(2, $_GET['token']);
   $query->binValue(3, $_GET['id']);
   
   $query->execute();}}}
0
Personnellement, j'aurais plutôt essayer de faire ça :
$query = $con->prepare('SELECT password_recovery_asked_date FROM matable WHERE password_recovery_token = ? AND id_annonce = ?');
$query->execute(array($_GET['token'], $_GET['id']);
 
$row = $query->fetch(PDO::FETCH_ASSOC);

if (empty($row)) { 
 echo 'Ce token n\'a pas été trouvé';
 exit;
}


// On calcul la date de la génération du token + 3hrs
$tokenDate = strtotime('+3 hours', strtotime($row['password_recovery_asked_date']));
$todayDate = time();
 
if ($dateToken < $dateToday) { // Si la date est dépassé le délais de 3hrs
 echo 'Token expiré !';
 exit;
}

if (isset($_POST['refresh'])) { // Si le formulaire a été soumis
 if (!empty($_POST['password']) && !empty($_POST['password_confirm'])) { // Si le formulaire est correctement remplit
  if ($_POST['password'] == $_POST['password_confirm']) { // Si les deux mots de passes sont les mêmes
   // On hash le mot de passe
   $password = password_hash($_POST["password"], PASSWORD_BCRYPT);
   
 
   // On modifie les informations dans la base de données
$query = $con->prepare('UPDATE matable SET m2p = ?, password_recovery_token = ? WHERE id_annonce = ? VALUES(?, ?, ?)');
$query->execute(array($password, $_GET['token'], $_GET['id']));}}}

(je ne suis pas très bon en sql mais ça devrait marcher)

Bonne journée, Programmeur101
0
Programmeur101
9 févr. 2022 à 12:26
Je rajoute :
<form class="row" method="post" action="reinitialisation-mot-de-passe.php?token=<?= $_GET['token']?>&id=<?= $id?>">

Car <?= ?> permet d'inserer une variable php sans passer par echo
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour

Merci @Programmeur101 pour tes réponses, mais je ne parviens toujours pas à remédier à mon soucis.
je remets mon code complet (peut-être un pb d'accolades)

Mon formulaire
      <form class="row" method="post" action="reinitialisation-mot-de-passe.php?token=<?= $_GET['token']?>&id=<?= $id?>">
                                    <div class="col-md-6 col-sm-12">
                                       <div class="form-group">
                                          <label>Nouveau mot de passe <span class="required">*</span></label>
                                          <input type="password" placeholder="" name="password" class="form-control" required>
                                       </div>
                                    </div>
                                    
                                    <div class="col-md-6 col-sm-12">
                                       <div class="form-group">
                                          <label>Confirmer mot de passe<span class="required">*</span></label>
                                          <input type="password" placeholder="" name="password_confirm" class="form-control" required>
                                       </div>
                                    </div>
                                    
                                    <div class="col-md-12 col-sm-12">
                              <button type="submit" name="reboot" > Réinitialiser</button>
                                    </div>
                                 </form>
                    

       </div>

                        <div style="color:red;" id="errorMessages2"><?php echo $msg_m2p;?></div> 


et mon traitement

<?php

  if (isset($_POST['reboot']))
  {
  $query = $con->prepare('SELECT password_recovery_asked_date FROM matable WHERE password_recovery_token = ?');
  $query->bindValue(1, $_GET['token']);
  $query->execute();
   
  $row = $query->fetch(PDO::FETCH_ASSOC);
  
    if (empty($row)) { 
     echo 'Ce token n\'a pas été trouvé';
     exit;
    }
  
  
    // On calcul la date de la génération du token + 3hrs
    $dateToken = strtotime('+3 hours', strtotime($row['password_recovery_asked_date']));
    $dateToday = time();
     
    if ($dateToken < $dateToday) { // Si la date est dépassé le délais de 3hrs
     echo 'Token expiré !';
     exit;
    }
  
  
   if (!empty($_POST['password']) && !empty($_POST['password_confirm'])) 
   { 
    if ($_POST['password'] === $_POST['password_confirm']) { 
   
     $password = password_hash($_POST["password"], PASSWORD_BCRYPT);
     
  
  
  $query = $con->prepare('UPDATE matable SET m2p = ?, password_recovery_token = " " WHERE id_annonce = ?');
  $query->binValue(1, $password);
  $query->binValue(2,$id);
  $query->execute();

     //$query->execute();

     $msg_m2p = '<div style="color: green;">Le mot de passe a été changé !</div>';
    }

    
    else { // si les deux mots de passe ne sont pas identiques
     $msg_m2p = '<div style="color: red;">Les deux mots de passes ne sont pas identiques.</div>';
    }
   } 
   
   else {
    $msg_m2p = '<div style="color: red;
    ">Veuillez remplir tous les champs du formulaire.</div>';
   }
  }
  
?>



Merci d'avance
0
Bonjour, personne pour m'enlever cette épine du pied?
0
Rejoignez-nous