Bonjour à tous,

Depuis 3 jours, je mets en place le tuto de Gestion d'un espace membre sur mon site. Étant donné que mon site était déjà bien avancé, je dois m'adapter à mon code. ;)

Ce que je fais

Par rapport au tuto :
Inscription user = nickel.
Confirmation du compte = nickel.
Connexion = nickel.
Réinitialisation du mdp = la cata.

Sur cette étape, l'utilisateur depuis la page "Se connecter" clique sur le lien "Mot de passe oublié" et est redirigé sur la page en question. Il saisit son adresse mail, reçoit un mail avec un lien contenant son id et son token qui s'est bien ajouté en bdd ainsi que la date. En cliquant sur le lien en question, il est redirigé sur la page "reinitialisation_mdp.php', avec les deux champs pour le mdp. Et quand on valide sur ce formulaire-là, il passe à la page définie en else, donc il ne rentre pas dans la condition.
Et je n'arrive pas à trouver pourquoi.
Je ne dis pas que j'ai tout essayé, sinon j'aurais trouvé la réponse. Mais depuis deux jours j'y suis h24. J'ai le cerveau en compte.
J'ai même essayé d'adapter le code de confirmation de compte, mais ça ne fonctionne pas.
J'ai vraiment besoin de vos lumières svp.

Ce que je veux

Que cette réinitialisation de mot de passe fonctionne bien sûr !

Ce que j'ai

Voici ma page "reinitialisation_mdp.php"

<?php
ob_start();
$title = 'Réinitialisation du mot de passe';
?>
<fieldset>
    <div class="container10">
    <link rel="stylesheet" href="../components/feuille.css">  

    <?php if (isset($_SESSION['flash'])): ?>
        <?php foreach($_SESSION['flash'] as $type => $message): ?>
            <div class="alert alert-<?= $type; ?>">
                <?= $message; ?>
            </div>
        <?php endforeach; ?>
        <?php unset($_SESSION['flash']); ?>
    <?php endif; ?>

      <div class="heading">
            <h2>Réinitialisation de mon mot de passe</h2>
            <div class="paragrapheSousTitre">
                <p> Vous souhaitez changer de mot de passe.
                Merci de remplir les deux champs ci-dessous</p>
                <?php
                    if(isset($_SESSION['erreurreinit'])){// si y a une erreur je rentre dans la boucle 
                        for($i=0; $i< sizeof($_SESSION["erreurreinit"]);$i++){
                    echo'<font color="red">'. $_SESSION['erreurreinit'][$i].'<br>'."</font>";
                    };
                    unset($_SESSION['erreurreinit']);
                    }  ?> 
            </div>
        </div>
        <form class="form-row" method="POST" action="index.php" role="form" id="form-reinitialisation">

            <div class="col-12 form-group-cadreSection"> <!-- ma ligne de début section  -->
            <div class="form-group-cadreNomSection">Réinitialisez votre mot de passe</div>
                <div class="col-12 form-group">
                    <label id="passwordReset1" for="passwordReset1input">Nouveau mot de passe<span class="etoile">*</span></label>
                    <input type="password" id="passwordReset1input" class="form-control" name="passwordReset1input" placeholder="Entrez votre nouveau mot de passe" required>
                </div>
                <div class="col-12 form-group">
                    <label id="passwordReset2" for="passwordReset2input">Confirmation du nouveau mot de passe<span class="etoile">*</span></label>
                    <input type="password" id="passwordReset2input" class="form-control" name="passwordReset2input" placeholder="Confirmez votre nouveau mot de passe" required>
                </div>
            </div>
            <div class="col-12 form-group" id="divbtn-reinitialisation">
                <button type="submit" class="btn-reinitialisation" id="boutonReinitialisationMdp" name="boutonReinitialisationMdp" value="1">Réinitialiser mon mot de passe</button>
            </div>
        </form>
    </div>
</fieldset>
<?php
    $content = ob_get_clean();
    require 'views/template.php';
?>

Le formulaire à comme action index.php, et le bouton "boutonReinitialisationMdp" est associé à une fonction dans index.php.
Voici la partie qui nous intéresse de index.php :

<?php
session_start();
require_once 'controller/frontend.php'; //inclure le fichier qui contient toutes les fonctions
[...]
else if(isset($_POST['boutonReinitialisationMdp'])){ //vérifier si le bouton "boutonReinitialisationMdp" a été déclenché sur le formulaire de réinitialisation mdp
    displayFormReinitMdp(); //appel de la fonction qui insert le nouveau mdp en bdd
  }

Voici la partie qui nous intéresse dans le fichier "controller/frontend.php".

<?php
require_once 'model/config.php'; // inclure le fichier qui contient la connexion à la bdd 
?>
 <?php
 function displayFormReinitMdp(){ //fonction qui contient le traitement  de réinitialisation mdp
    require_once 'model/frontend.php';
    reinitialisation_mdp();  //appeler la fonction qui réinitialise le mdp
}

Et enfin la fonction elle même présente dans le fichier "model/fronted.php". reinitialisation_mdp() :

function reinitialisation_mdp(){
    if(isset($_GET['id']) && isset($_GET['token'])){
        $bdd = connect();
        $requestreinit = $bdd->prepare('SELECT * FROM utilisateurs WHERE id_utilisateur = ? AND reset_mdp_token_utilisateur IS NOT NULL AND reset_mdp_token_utilisateur = ? AND reset_mdp_le_utilisateur > DATE_SUB(NOW(), INTERVAL 30 MINUTE)');
        $requestreinit->execute([$_GET['id'], $_GET['token']]);
        $user = $requestreinit->fetch();

        if($user){
            if(!empty($_POST)){
                if(!empty($_POST['passwordReset1input']) && $_POST['passwordReset1input'] == $_POST['passwordReset2input']){
                    $password = password_hash($_POST['passwordReset1input'], PASSWORD_DEFAULT);
                    $bdd->prepare('UPDATE utilisateurs SET mdp_utilisateur = ?, reset_mdp_le_utilisateur = NULL, reset_mdp_token_utilisateur = NULL')->execute([$password]);
                    session_start();
                    $_SESSION['flash']['success'] = 'Votre mot de passe a bien été modifié';
                    $_SESSION['auth'] = $user;
                    return header('Location: index.php?login=connexion');
                    exit();
                }
            }
        }else{
            session_start();
            $_SESSION['flash']['danger'] = "Ce token n'est pas valide";
            return header('Location: index.php?login=connexion');
            exit();
        }
    } else{
        return header('Location: index.php?inscrire=inscrire');
        exit();
    }
}

Et au cas où vous en ayez besoin, voici la fonction qui est utilisé pour envoyer le mail de réinitialisation :

function send_mailreinitmdp(){
    if(!empty($_POST) && !empty($_POST['recup_mailinput'])){
        $bdd = connect();
        $requestresetmdp = $bdd->prepare('SELECT * FROM utilisateurs WHERE email_utilisateur = ? AND confirme_le_utilisateur IS NOT NULL');
        $requestresetmdp->execute([$_POST['recup_mailinput']]);
        $user = $requestresetmdp->fetch();

        $user_id = $user['id_utilisateur'];

        if($user){
            session_start();
            $reset_token = str_random(60);
            $bdd->prepare('UPDATE utilisateurs SET reset_mdp_token_utilisateur = ?, reset_mdp_le_utilisateur = NOW() WHERE id_utilisateur = ?')->execute([$reset_token,$user_id]);

            // Envoi du mail à l'envoyeur
            $send_to_reinit_mdp = $_POST['recup_mailinput'];
            $objet_mail_reinit_mdp = "Réinitialisation de votre mot de passe pour le compte bénévole Meeting Aérien Des Etoiles et Des Ailes";  

            $message_mail_reinit_mdp = '<html>';
            $message_mail_reinit_mdp .= '<body>';

            $message_mail_reinit_mdp .= '<p>'."Bonjour ".'</p>'.'<br/>';
            $message_mail_reinit_mdp .= '<p>'."Vous recevez ce mail car vous souhaitez réinitiliser votre mot de passe pour votre compte bénévole pour le Meeting Aérien Des Etoiles et Des Ailes.".'</p>';
            $message_mail_reinit_mdp .= '<p>'."Veuillez cliquer sur le lien ci-dessous afin d'être redirigé vers la page pour réinitialiser votre mot de passe.".'</p>';

            $message_mail_reinit_mdp .= '<p>'."http://prive.benevolesdeda.com/index.php?reinitmdp2=changement-mdp&id=$user_id&token=$reset_token pour réinitialiser votre mot de passe.".'</p>';

            $message_mail_reinit_mdp .= '<div>'.'<img src="images/logo-generique.jpg" alt="Le Logo DEDA" style="float:left;margin-left:10px;margin-right:10px;"/>';
            $message_mail_reinit_mdp .= '<p>'.'<span style="text-decoration: uderline;font-weight: bold;">'.'L\'Equipe Responsable des bénévoles'.'</span>'.'</p>';
            $message_mail_reinit_mdp .= '<p>'.'<span style="text-decoration: uderline;font-weight: bold;">'.'Meeting Aérien Des Etoiles et Des Ailes !'.'</span>'.'</p>';
            $message_mail_reinit_mdp .= '<p>'.'benevoles@meetingdeda.com'.'</p>';
            $message_mail_reinit_mdp .= '<p>'.'</br>'.'<span style="text-decoration:uderline;font-weight:bold;font-size:7px;">'.'Ceci est un mail automatique, merci de ne pas y répondre'.'</span>'.'</p>';
            $message_mail_reinit_mdp .= '</div>';
            $message_mail_reinit_mdp .= '<body>';
            $message_mail_reinit_mdp.= '</html>';

            $headers_reinit_mdp = 'MIME-Version: 1.0'."\r\n";
            $headers_reinit_mdp .= 'Content-type: text/html; charset=UTF-8'."\r\n";

            mail($send_to_reinit_mdp, $objet_mail_reinit_mdp, $message_mail_reinit_mdp, $headers_reinit_mdp);

            return header('Location:index.php?reinitmdpmessage1=message-reinitialisation-mdp');exit();

        }else{
            $_SESSION['flash']['danger'] = 'Aucun compte ne correspond à cette adresse';
            return header('Location:index.php?reinitmdp1=reinitialisation-mdp');exit();
        }
    } else {
        $_SESSION['flash']['danger'] = 'Vous devez saisir une adresse email.';
        return header('Location:index.php?reinitmdp1=reinitialisation-mdp');exit();
    }   
}

Ce que j'obtiens

Donc, quand je valide le formulaire de réinitialisation, j'atterris sur la page "index.php?inscrire=inscrire" au lieu de ma page de connexion si le if de base est rempli.
J'ai tenté de ne pas utiliser ce premier if, mais ça n'a pas marché non plus.
N'étant pas une pro, je tâtonne un peu niveau test, mais j'ai l'impression que ma fonction "reinitialisation_mdp" n'arrive pas à récupérer les valeurs id et token du lien, donc, on ne rentre jamais dans le if.
Et je n'arrive pas à trouver pourquoi.

Je vous remercie par avance pour toute l'aide que vous pourrez m'apporter. J'ai vraiment besoin de lumière extérieure.
EllyWill

4 réponses


EllyWill
Auteur
Réponse acceptée

Carouge10,
Je te remercie vraiment de ton aide. Je n'ai pas fait exactement comme tu disais, mais tu m'as mise sur la piste de la réussite (enfin !!!).

Donc, sur mon formulaire réinitialisation_mdp.php, j'ai rajouté deux inputs en hidden qui récupèrent en GET les valeurs des variables contenues dans l'adresse.

<form class="form-row" method="POST" action="index.php" role="form" id="form-reinitialisation">

        <input type="hidden" name="id" value="<?php echo $_GET['id']; ?>" />
        <input type="hidden" name="token" value="<?php echo $_GET['token']; ?>" />

Et j'ai changé ma fonction reinitialisation_mdp en conséquence. C'est à dire que je récupère les variables en POST (et j'ai mis le Where, comme tu l'avais si bien vu !)

function reinitialisation_mdp(){
    if(isset($_POST['id']) && isset($_POST['token'])){
        $bdd = connect();
        $requestreinit = $bdd->prepare('SELECT * FROM utilisateurs WHERE id_utilisateur = ? AND reset_mdp_token_utilisateur IS NOT NULL AND reset_mdp_token_utilisateur = ? AND reset_mdp_le_utilisateur > DATE_SUB(NOW(), INTERVAL 30 MINUTE)');
        $requestreinit->execute([$_POST['id'], $_POST['token']]);
        $user = $requestreinit->fetch();

        if($user){  
            if(!empty($_POST)){
                if(!empty($_POST['passwordReset1input']) && $_POST['passwordReset1input'] == $_POST['passwordReset2input']){
                    $password = password_hash($_POST['passwordReset1input'], PASSWORD_DEFAULT);
                    $bdd->prepare('UPDATE utilisateurs SET mdp_utilisateur = ?, reset_mdp_le_utilisateur = NULL, reset_mdp_token_utilisateur = NULL WHERE id_utilisateur = ?')->execute([$password,$_POST['id'] ]);
                    session_start();
                    $_SESSION['flash']['success'] = 'Votre mot de passe a bien été modifié';
                    $_SESSION['auth'] = $user;
                    return header('Location: index.php?login=connexion');
                    exit();
                }
            }
        }else{
            session_start();
            $_SESSION['flash']['danger'] = "Ce token n'est pas valide";
            return header('Location: Location:index.php?reinitmdp1=reinitialisation-mdp');
            exit();
        }
    } else{
        return header('Location: index.php?inscrire=inscrire');
        exit();
    }
}

Merci encore de m'avoir apporté ton aide !
Peut-être que mon problème servira à d'autre.
Bonne continuation ;)

Bonjour,

  • Tu ne transmets pas dans ton formulaire de réinitialistion du mot de passe, ni le reset_token (afin de vérifier si il a le droit de ré-initialisé le mdp), ni l'id de l'utilisateur à modifier
  • Pour le reset tu fais un UPDATE sur TOUTES les lignes puisque tu ne spécifies pas de clause WHERE afin de dire la bonne ligne à modifier
EllyWill
Auteur

Bonjour Carouge10,
Merci pour ta réponse.
• En effet, pour ton premier point, j'avais identifié ce problème à un moment donnée, puis j'ai du l'oublier. Le fait est quand dans le lien qui permet d'accèder à la page de réinitialisation, il y a l'id et le token. Je pensais donc que cela suffissait pour les récupèrer et les envoyer dans le formulaire. A priori non ;) Cependant, je ne vois pas comment récupérer à nouveau cet id et ce token depuis le lien, car il me semble que ce serait la seule façon de pouvoir le faire. Aurais tu une idée, s'il te plait ?
• Et pour le second point, bien vu, merci ;) Je vais corriger ça de suite, ce sera effectivment mieux pour la suite de ne pas réinitialiser tout le monde !

Vu que tu les récupères en GET après, autant les remèttre dans "action" comme paramètre