Création espace membre avec hash_password

Ce topic a été résolu
StephanieFx

StephanieFx Le 20 juillet 2018 à 19:27 (Édité le 25 janvier 2019 à 17:54)

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
Johan-Krn

Johan-Krn Le 20 juillet 2018 à 21:29

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

StephanieFx Le 21 juillet 2018 à 15:38

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...
Johan-Krn

Johan-Krn Le 21 juillet 2018 à 15:48

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

StephanieFx Le 21 juillet 2018 à 16:17

Ç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... !
Johan-Krn

Johan-Krn Le 21 juillet 2018 à 17:03

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

StephanieFx Le 22 juillet 2018 à 21:04

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
Johan-Krn

Johan-Krn Le 23 juillet 2018 à 22:51

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

StephanieFx Le 24 juillet 2018 à 10:04 (Édité le 24 juillet 2018 à 10:12)

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
Johan-Krn

Johan-Krn Le 24 juillet 2018 à 21:30

Remplace les variable $userinfo par $userexist 
StephanieFx

StephanieFx Le 25 juillet 2018 à 08:41

ç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
Johan-Krn

Johan-Krn Le 25 juillet 2018 à 16:57

Oui fait voir je vais essayer de comprendre.
StephanieFx

StephanieFx Le 25 juillet 2018 à 21:28 (Édité le 25 juillet 2018 à 21:42)

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...
Johan-Krn

Johan-Krn Le 25 juillet 2018 à 22:20

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

StephanieFx Le 26 juillet 2018 à 09:34 (Édité le 27 juillet 2018 à 11:57)

oui les voici  [ ]
Johan-Krn

Johan-Krn Le 26 juillet 2018 à 15:25

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

StephanieFx Le 27 juillet 2018 à 10:44

ç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 ?
Johan-Krn

Johan-Krn Le 27 juillet 2018 à 11:19

ç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

StephanieFx Le 27 juillet 2018 à 11:56 (Édité le 27 juillet 2018 à 11:57)

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 ?
Johan-Krn

Johan-Krn Le 27 juillet 2018 à 12:37

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

StephanieFx Le 27 juillet 2018 à 16:25 (Édité le 27 juillet 2018 à 16:26)

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

vainoctagon Le 25 septembre 2018 à 00:33

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 Geometry Dash apk online.
. 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...
Est-ce que je pourrais soit avoir les fichiers ou soit faire un TeamViewer pour tester ?
Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte