Bonjour,

Voila je rencontre un petit problème avec mon code. J'ai suivi ce tuto ici afin de faire une petite gestion de permission.
Cepandant pour sécurisé le tout, j'ai hash mes mots de passe avec 'password_hash' & 'PASSWORD_BCRYPT'.

Ce que je fais pour password_verify :

function login($loggin){
        global $bdd;
        $req = $bdd->prepare('SELECT users.id, users.username, users.pseudo, roles.name, roles.slug, roles.level FROM users LEFT JOIN roles ON users.role_id=roles.id WHERE username=:username AND password=:password');
        $req->execute($loggin);
        $data = $req->fetchAll();
        if(count($data)>0){
            if(password_verify($_POST['password'], $data->password)){
            $_SESSION['Auth'] = $data[0];
            return true;
        }
        return false;
    }
}

dans mon fichier class.auth.php

Ce que j'obtiens

Identifiant ou mot de passe incorrect, le script n'arrive pas à vérifier le mot de passe

12 réponses


marrtin
Auteur
Réponse acceptée

Après plusieurs essais , j'ai enfin réussi ! :D

function login($loggin){
        global $bdd;
        $req = $bdd->prepare('SELECT users.id, users.username, users.pseudo, users.password, roles.name, roles.slug, roles.level FROM users LEFT JOIN roles ON users.role_id=roles.id WHERE username=:username');
        $req->execute(array(':username'=>$_POST['username']));
        $data = $req->fetch();
        if(password_verify($_POST['password'], $data->password)){ // Ligne 8 en question
            $_SESSION['Auth'] = $data;
            return true;
        }
        return false;
    }

Par contre quand je rentre rien dans mon login/password j'ai ce message : Notice: Trying to get property of non-object in C:\wamp\www\class.auth.php on line 8

marrtin
Auteur

Nop ça n'a pas l'air de fonctionner =/

$data = $req->fetch();

C'est fetch et pas fetchAll

Tu t'embête pour rien count() alors qu'un rowCount(); en PDO ferait l'affaire, plusieurs variables en trop également ^^

Bonjour.
Première chose, que contient exactement ta variable $loggin, un tableau ?
Ensuite, de quelle manière ton objet PDO récupère t'il tes résultats SQL, sous forme d'objet ?
Et puis comme l'a dit Cobryn, utilises plutôt fetch à la place de fetchAll, car ce que tu veux, c'est ne récupérer qu'un seul résultat et non plusieurs, sinon c'est que tu as mal fait ton système d'inscription d'inscription si plusieurs utilisateurs peuvent avoir le même nom d'utilisateur et le même mot de passe.
En parlant de mot de passe, si tu transmets dans ta requête SQL un mot de passe non encodé, alors que dans ta base de données il est encodé, tu n'auras jamais de résultat positif.

marrtin
Auteur

Ok d'accord, je comprend mieux parce que je n'ai pas de système d'inscription, il s'agit d'un outil en PHP que j'ai vérouillé avec un système de session. Les mots de passe que j'ai entrer dans ma BDD sont encryptés et copier manuellement par mes soins.

Bonjour

if(password_verify($_POST['password'], $data->password))

Je rajouterais que tu demandes de verifier le mot de passe alors que tu ne le selectionnes pas dans requête

SELECT users.id, users.username, users.pseudo, roles.name, roles.slug, roles.level FROM ...

Devrait plutot être : non ?

SELECT users.id, users.username, users.password, users.pseudo, roles.name, roles.slug, roles.level FROM ...

Je suis sur téléphone c'est pas évidant pour les copiers coller, désolé :)

marrtin
Auteur

Merci kwik mais j'avais déjà essayé cette solution ^^"

Essaye de rehasher tes mots de passe en utilisant PASSWORD_DEFAULT au lieu de PASSWORD_BCRYPT

Ensuite, tu ne peux pas directement comparer le mot de passe dans la requête, tu dois le faire par après

function login($loggin){
        global $bdd;
        $req = $bdd->prepare('SELECT users.id, users.username, users.password, users.pseudo, roles.name, roles.slug, roles.level FROM users LEFT JOIN roles ON users.role_id=roles.id WHERE username=:username');
        $req->execute($loggin);// *
        $data = $req->fetchAll();
        if(count($data)>0){
            if(password_verify($_POST['password'], $data[0]->password)){// **
                $_SESSION['Auth'] = $data[0];
                return true;
            }
        }
        return false;
}

* Si tu as une erreur, c'est que tu as la clé password qui est définie mais pas utiliser, tu dois alors changer $loggin en ['username' => $loggin['username']]
** Au lieu de $_POST['password'], ce ne serait pas $loggin['password'] ??

Essaye quelque chose comme ça, peut-être

marrtin
Auteur

Hm nop ça fonctionne toujours pas... Je suis un peu perdu, j'ai des doutes si je mets le code ici dans mon fichier class.auth.php ou bien sur mon login.php ... je pensais que sa serai simple de rajouter cette fonction ^^"

Par contre quand je rentre rien dans mon login/password j'ai ce message : Notice: Trying to get property of non-object in C:\wamp\www\class.auth.php on line 8

Il te faut vérifier que tu as bien les informations nécessaires avant de faire la requête SQL, car il est normal que tu aies ces erreurs étant donné que tu en a besoin d'une pour la requête et l'autre pour vérifier la correspondance entre la donnée postée par le formulaire et une donnée à récupérer dans la base de données.
Pour traduire le problème simplement, il suffit que l'une des deux information manque (username ou password), pour que ta fonction rencontre une erreur, si le nom d'utilisateur manque, aucun enregistrement ne pourra être retourné par SQL, du coup, tu rencontreras un problème dans la fonction password_verify qui ne pourra pas faire la comparaison entre deux valeurs, surtout que tu vas vouloir utiliser un objet qui n'existe pas avec $data->password, étant donné que la variable $data vaudra null.
Par contre, à quoi ça te sert de définir une variable en argument dans ta fonction si tu ne t'en sert pas ?
Tu définis la variable $loggin, mais tu ne l'utilises à aucun moment dans ta fonction.

marrtin
Auteur

Ok, je vais me pencher sur ça ! Merci à tous pour votre aide.
Pour ma variable $logginelle me sert pour pour d'autre fonction, notement des fonctions de permissions (rôles des users : Admin, Membre... etc)