Veuillez vous connecter ou créer un compte pour suivre ce topic
Ce topic est suivi par: Jerem971, StephanieFx, ToutPax
Ce topic a été résolu
Auteur Sujet: Création espace membre avec hash_password

StephanieFx

Messages: 10

Bonsoir à tous/toutes,
Je débute complètement en php, je réalise actuellement mon premier projet qui nécessite la création d'un compte utilisateur et donc la connexion au compte.
J'ai suivi le tuto proposé par PrimFx que j'ai adapté.
Le problème est que j'aimerais sécuriser le mot de passe avec hash_password et verify_password et que le tuto utilise sha1. J'ai essayé de modifier le code. Je parviens à créer le compte utilisateur, le code génère et stocke bien un password hashé dans ma bdd, mais je ne parviens pas à me connecter, ça fait un moment que je butte dessus malgré plusieurs essais...
Dans ma base sql, les mots de passe sont stockés en CHAR 64.
Quelqu'un(e) pourrait-il/elle m'aider ? Merci par avance 😉

page de création de compte

page de connexion
Publicité

ToutPax

Messages: 61

Bonjour, tu as fait plusieurs erreurs pour faire simple au niveau de l'inscription il n'y a pas de problème mais au niveau de la connexion tu t'y prends mal bref en gros tu essayes de faire correspondre le mot de passe claire avec le crypt enregistré en base de données et après tu vérifies avec la fonction Php si c'est ok

Les choses a modifié :
dans "Préparation de la requête SQL" enlève 
AND password = ?
et dans "Exécution de la requête" enlève la variable $passwordconnect ensuite au lieu de faire un "rowCount" fait un "fetch" et enfin dans la partie "Va chercher l'id de l'utilisateur" change la variable $hashed_password par le mot de passe crypt de la bdd

en gros fait ça :
$requser = $pdo->prepare("SELECT * FROM users WHERE email = ?");
$requser->execute([$emailconnect]);

$userexist = $requser->fetch(PDO::FETCH_OBJ);

if($userexist && password_verify($passwordconnect, $userexist->password)){
   ...
}

StephanieFx

Messages: 10

Merci pour ta réponse ToutPax !
Cela fonctionne, mais aléatoirement, en fait je ne parviens pas à me connecter systématiquement, j'ai vidé ma
bdd pour repartir de zéro, j'ai créé 3 comptes, je ne peux me connecter
qu'à 1 sur 3...

ToutPax

Messages: 61

C'est bizarre essaie de remplacer "PASSWORD_DEFAULT" par "PASSWORD_BCRYPT" dans le script d'inscription et recrée les compte et je pense que tu la fait mais tu a laisser "$password = '';" donc tu crypt du vide met $_POST['password'] dans la fonction password_hash si jamais c'était pas le cas !

StephanieFx

Messages: 10

Ça marche ! merci beaucoup 😉

en fait, je déclarais ma variable $password vide car j'avais un message d'erreur "Notice: Undefined variable" c'est la seule manière que j'ai trouvé pour que l'erreur ne s'affiche plus, mais peut-être faut-il éviter ce genre de pratique ?

par contre, j'ai 2 "fonctions" qui ne marchent plus depuis les modifs

pour souhaiter la bienvenue à l'utilisateur, j'ai fait un if en allant chercher la session par id, et remplacer "connexion" par "déconnexion" :
<?php
    if (isset($_SESSION['id']) AND $userinfo['id'] == $_SESSION['id']) {
    ?>
    <a href="profil_edit.php">Editer mon profil</a>
    <a href="user_deconnexion.php">Se déconnecter</a>
    <?php  
    }
    ?>
(mais l'id n'est plus récupéré...)

et j'ai fait une page déconnexion qui récupérait le tableau que j'ai enlevé de ma page d'inscription :
<?php
session_start();
// Vide la session
$_SESSION = array();
session_destroy();
header("Location: index.php");
?>

comme je ne peux plus appeler mon tableau, dois-je bien utiliser fetch à la place ? je tâtonne, et j'essaie de comprendre, merci pour ta patience... !

ToutPax

Messages: 61

En fait dans le if password_verify enlève ton
$userinfo = $requser->fetch();
car dans le code que je t'es envoyer le fetch est déjà fait plus haut de plus j'ai ajouter un argument au fetch ce qui te bloque car moi j'ai fait un FETCH_OBJ pour récupérer les infos en objets mais après tu les utilise comme si c'était un tableau pour que ça soit plus simple comprend juste qu'un FETCH_OBJ  = $requser->username et FETCH_ASSOC = $requser['username']

en gros remplace ça
$userexist = $requser->fetch(PDO::FETCH_OBJ); // récupération des infos : $requser->username
// Par ça
$userexist = $requser->fetch(PDO::FETCH_ASSOC); // récupération des infos : $requser['username']
// Ou ça
$userexist = $requser->fetch(); // Vide car par défaut c'est en tableau
pour finir ton problème "Notice: Undefined variable"(page d'inscription) viens du fait que $password n'existe pas mais quand tu met $password = '';(ligne 17) elle existe jusque la normal seulement tu n'a pas besoin de cet variable car dans la fonction password_hash a la place de mettre $password(qui va crypt du vide) met ça $_POST['password'](qui va crypt le mot de passe) donc pas besoin de $password !

Autre chose quand tu regardes des fonctions sur php.net ne prend pas leurs arguments avec, en fait les arguments afficher son purement démonstratif, il faudra toujours que les arguments des fonctions soient les tiennes !

Dernière chose je te conseille de regarde cette série de tuto : Créer un réseau social en PHP ça me beaucoup aider a comprendre PHP donc peut-être d'autre personne aussi !

StephanieFx

Messages: 10

Oui je  ne comprenais pas pourquoi il fallait  2 fetch, ok pour ton explication
Pour le $password = ''; j'ai fait comme tu m'as dit lors de ton 2ème message et l'erreur n'apparait plus 😉
J'ai noté pour les arguments, et je ferais le tuto que tu me conseilles aussi, j'ai vraiment besoin de pratique, merci pour ces conseils !

Par contre, j'ai des erreurs malgré les dernières modifs

Si je fais :
$userexist = $requser->fetch(PDO::FETCH_ASSOC);
if($userexist && password_verify($passwordconnect, $userexist->password)) {
$_SESSION['id'] = $userinfo['id'];
           $_SESSION['username'] = $userinfo['username'];
           $_SESSION['email'] = $userinfo['email'];
> j'ai cette erreur : Notice: Undefined variable: userexist in C:\wamp64\www\...\user_connexion.php on line 36 (là où débute le if)

Et si je fais :
$userexist = $requser->fetch();
if($userexist && password_verify($passwordconnect, $userexist->password)) {
$_SESSION['id'] = $userinfo['id'];
$_SESSION['username'] = $userinfo['username'];
$_SESSION['email'] = $userinfo['email'];
> j'ai cette erreur : Notice: Trying to get property of non-object in C:\wamp64\www\...\user_connexion.php on line 36

ToutPax

Messages: 61

remplace "$userexist->password" par $userexist['password'] (dans le if car si l'argument du fetch est vide ou FETCH_ASSOC ça sera un tableau) si ta une autre erreur met un @ devant la variable $userexist dans le if !

Désoler pour le temps de réponse.

StephanieFx

Messages: 10

Pas de souci pour le temps de réponse, c'est déjà sympa de m'aider !
Là, ça fonctionne, mais je ne comprends pas pourquoi je ne parviens plus à récupérer l'id du profil connecté...
Par exemple, pour le compte utilisateur, j'ai fais ça :
<?php
session_start();
    // Connection à la BDD
    require_once __DIR__.'/bdd_connexion.php';

    // Récupération de l'id de l'utilisateur
    if (isset($_GET['id']) AND $_GET['id'] > 0) {
        $getid = intval($_GET['id']);

    // Préparation de la requete SQL
                $requser = $pdo->prepare
                    (
                        'SELECT * FROM
                            users
                        WHERE
                            id = ?
                        '
                    );
                // Execution de la requete
                $requser->execute([$getid]);
                $userinfo = $requser->fetch(); >> j'ai essayé avec PDO::FETCH_ASSOC ça ne fonctionne pas
}

<?php
    if (isset($_SESSION['id']) AND $userinfo['id'] == $_SESSION['id']) {
    ?>
    <a href="profil_edit.php">Editer mon profil</a>
    <?php  
    }
    ?>

et ça dans une une autre page :
<?php
                if (isset($_SESSION['id'])) {
                    echo "Bienvenue ".$_SESSION['username'];
                ?>
                <a href="user_deconnexion.php">Se déconnecter</a>
                <?php  
                } else {
                ?>
                <li class="user-connexion"><a href="user_connexion.php">Connexion</a></li>
                <?php  
                }
                ?>
Ma page de connexion est comme ça maintenant

ToutPax

Messages: 61

Remplace les variable $userinfo par $userexist 

StephanieFx

Messages: 10

ça ne change rien... veux-tu que je te remette les pages actuelles pour y voir plus clair ? je cherche de mon côté aussi mais je ne comprends pas pourquoi je ne parviens pas à récupérer l'id

ToutPax

Messages: 61

Oui fait voir je vais essayer de comprendre.

StephanieFx

Messages: 10

ok !
. pour créer un compte utilisateur (modifié au début avec le hashpassword) : create_account_php
. pour que l'utilisateur se connecte (modifié au début avec le hashpassword) : user_connexion_php
. quand l'utilisateur est sur son compte : user_account_php et user_account_phtml
> n'affiche plus "éditer mon profil" depuis les modifs
. partie du site qui doit afficher "connexion" quand l'utilisateur n'est pas connecté et "bonjour username" et "déconnexion" quand l'utilisateur est connecté layout_phtml
> ne fonctionne plus depuis les modifs, n'affiche plus "bonjour username" ni " "déconnexion"
. pour que l'utilisateur se déconnecte : user_deconnexion_php
> j'appelle un array, j'ai essayé avec un fetch sans succès
j'espère que c'est à peu près clair...

ToutPax

Messages: 61

Est-ce que je pourrais soit avoir les fichiers ou soit faire un TeamViewer pour tester ?
Publicité

StephanieFx

Messages: 10

oui les voici  [ ]

ToutPax

Messages: 61

J'ai fais quelques tests, remplace formconnexion dans user_connexion.php par :
https://pastebin.com/F3nwLe7F

Si jamais ça fonctionne pas crée un dossier test et un ficher index.php par exemple et met ça :
https://pastebin.com/9krAtXYe
Puis essaye de te connecter pour voir si ça fonctionne !

StephanieFx

Messages: 10

ça marche !!!!! merci beaucoup, c'est génial 🙌
en fait, je bloquais complètement sur la session de l'utilisateur, j'étais persuadée que
c'était elle qu'il fallait aller chercher pour récupérer l'id
pour que je comprenne bien (après je ne t'embête plus, promis) quand tu fais un $user = $q->fetch(PDO::FETCH_OBJ); et que tu mets dans le if, par exemple : $_SESSION['id'] = $user->id; ça veut dire "va chercher" l'objet id du user de la session ?
alors que quand je faisais : $user = $q->fetch(PDO::FETCH_ASSOC); et  $_SESSION['id'] = $user['id']; ça allait chercher les données dans un tableau associatif ?

ToutPax

Messages: 61

ça fait plaisir que ça fonctionne enfin, en fait dans les 2 cas c'est censé fonctionner et du coup quand je fais $_SESSION['id'] = $user->id; ou $_SESSION['id'] = $user['id']; ça veut dire que j’attribue la session id à l'id que j'ai en base de données pareil pour email et username !

StephanieFx

Messages: 10

Ok ! merci encore ! oui je suis contente aussi, le plus dur reste à venir pour finir mon projet complet, si je parviens à le terminer dans les temps, je te le montrerais si ça t'intéresse ?

ToutPax

Messages: 61

Je te souhaite bon courage et oui je serais intéressé de voir comment se développe ton projet, je te laisse mon adresse email : johan@nofakepeople.com !

StephanieFx

Messages: 10

Merci, c'est noté 😉 A bientôt !


Vous devez vous connecter ou créer un compte pour poster une réponse