Bonjour,

Voila je rencontre un petit problème avec mon code, je vous explique
Enfaîte j'utilise la fonction password_hash pour crypté les mots de passes dans ma base de données
Mais je rencontre un problème dans mon système de connexion je ne sais comment comparer le mot de passe entrer par l'utilisateur et le mot de passe enregistré dans ma base de données avec cette fonction

Voici le code de mon login.php :

<?php
// Inclusions
require_once ('login.php');

if (isset($_POST['confirmer'])){
    // On vérifie si l'utilisateur à rempli tout les champs
    if (!empty($_POST['pseudo']) AND !empty($_POST['pass'])){
        // On déclare nos variables
        $pseudo = htmlspecialchars(strip_tags($_POST['pseudo']));
        $pass = $_POST['pass'];

        // Vérification des identifiants
        $req = $bdd->prepare('SELECT id FROM membres WHERE pseudo = :pseudo AND pass = :pass');
        $req->execute(array(
            'pseudo' => $pseudo,
            'pass' => $pass));

        $insertion = $req->fetch();

        if (!$insertion)
        {
            echo 'Mauvais identifiant ou mot de passe !';
        }
        else
        {
            session_start();
            $_SESSION['id'] = $insertion['id'];
            $_SESSION['pseudo'] = $pseudo;
            echo 'Vous êtes connecté !';
        }

    }else{
        echo '<div class="error">Veuillez remplir tout les champs</div>';
    }

}

Je vous remercie, bonne journée.
Cordialement.

12 réponses


Salut,

peu importe la méthode que tu utilises pour crypter tes mots de passe.

L'idée c'est que quand un utilisateur créer un compte,
tu le crypte avec la méthode de ton choix,
ce qui donne une chaine de caractères un peu longue,
que tu enregistres en base de données.
(ce que tu as fais pour l'instant)

Ensuite,
quand un utilisateur essaie de se connecter,
il rentre son mot de passe,
et toi tu RE crypte ce mot de passe (toujours avec la même méthode que tu avais choisi),
et tu compares la chaine de caractères obtenue avec celle enregistrée en base de données.

Donc là dans ton code, quand tu récupères le pass entré dans le formulaire,
il faut lui appliquer ta méthode de cryptage.

Remplacer :

$pass = $_POST['pass'];

Par :

$pass = password_hash($_POST['pass'], PASSWORD_DEFAULT);

PS :
Et comme tu utilises les fonctions htmlspecialchars() et strip_tags() pour le pseudo lors de la connexion, assures toi bien que tu les as aussi utilisées dans le script de la création du compte.

Bonjour.
Je crois que tu fais certaines confusions, car tu dis :

Voici le code de mon login.php

Alors que dans le code que tu nous montre, dès le début il y a require_once ('login.php');.
Ce qui voudrait donc dire que tu fais une inclusion du fichier lui même.
Ce qui n'est totalement pas logique.

@Larktak

Excusez-moi je n'ai pas tout détaillé ceci est le fichier login.php dans mon dossiers controllers
c'est donc pour cela que j'inclus mon fichier login.php

Salut,
La méthode password_verify permet de vérifier que le mot de passe entré en clair par l'utilisateur est le même que le mot de passe hashé en base de donnée donc il faut que tu fasses:

        // Vérification des identifiants
        $req = $bdd->prepare('SELECT id FROM membres WHERE pseudo = ?');
        $req->execute(array($pseudo)); // Pour les tableaux, utilise plutôt cette syntaxe []
        $insertion = $req->fetch();
        if ($insertion && password_verify($pass, $insertion['password'])) {
                        session_start();
                        $_SESSION['id'] = $insertion['id'];
                        $_SESSION['pseudo'] = $pseudo;
                        echo 'Vous êtes connecté !';
        } else {
                        echo 'Mauvais identifiant ou mot de passe !';
        }

Voilà en espérant avoir pu t'aider.

@Lartak, je pense que le fichier login.php doit être la vue et le fichier qu'il nous montre doit être son controller

Edit: je te conseil d'ailleurs de ne pas mettre en session l'id et le pseudo mais seulement l'id, car seul l'id ne peut pas changer.

Si le fichier dont tu fais l'inclusion contient du code HTML, tu vas avoir des soucis avec ton session_start, car pour rappel, session_start doit être appelé avant tout affichage de code HTML.

@Shouky, il me ressort "Undefined index password" à la ligne 19 pourtant c'est bon

Dizhuit Off, j'ai mis $insertion['password'] mais entre les guillemets tu remplaces 'password' par le champs que tu as définis pour le mot de passe dans ta table utilisateur en base de donnée donc en l'occurence c'est pass.

il me ressort "Undefined index password" à la ligne 19 pourtant c'est bon

Penses au passage à ajouter pass dans les champs à récupérer en base de données.

@Shouky J'avais compris mais sa me met encore l'erreur c'est pour sa que je comprend pas
@Lartak D'accord

Non j'ai mis pass aussi

Bonsoir,
Re post le code avec les modifications qu'on ta demandé.

@Massi El Rais: C'est bien de vouloir aider, mais cette solution à déja été proposé par Shouky 9 posts au dessus du tien.