Bonjour à vous tous,

Voila je rencontre un petit problème avec mon code.

<?php
class Auth{

    private $options = [
        'restriction_msg' => "Vous n'avez pas le droit d'accéder à cette page"
    ];
    private $session;

    public function __construct($session, $options = []){
        $this->options = array_merge($this->options, $options);
        $this->session = $session;
    }

    public function hashPassword($password){
        return password_hash($password, PASSWORD_BCRYPT);
    }

    public function register($db, $username, $password, $email){
        $password = $this->hashPassword($password);
        $token = Str::random(60);
        $db->query("INSERT INTO users SET username = ?, password = ?, email = ?, confirmation_token = ?", [
            $username,
            $password,
            $email,
            $token
        ]);
        $user_id = $db->lastInsertId();
        mail($email, 'Confirmation de votre compte', "Afin de valider votre compte merci de cliquer sur ce lien\n\nhttp://local.dev/Lab/Comptes/confirm.php?id=$user_id&token=$token");
    }

    public function confirm($db, $user_id, $token){
        $user = $db->query('SELECT * FROM users WHERE id = ?', [$user_id])->fetch();
        if($user && $user->confirmation_token == $token ){
            $db->query('UPDATE users SET confirmation_token = NULL, confirmed_at = NOW() WHERE id = ?', [$user_id]);
            $this->session->write('auth', $user);
            return true;
        }
        return false;
    }

    public function restrict(){
        if(!$this->session->read('auth')){
            $this->session->setFlash('danger', $this->options['restriction_msg']);
            header('Location: login.php');
            exit();
        }
    }

    public function user(){
        if(!$this->session->read('auth')){
            return false;
        }
        return $this->session->read('auth');
    }

    public function connect($user){
        $this->session->write('auth', $user);
    }

    public function connectFromCookie($db){
        if(isset($_COOKIE['remember']) && !$this->user()){
            $remember_token = $_COOKIE['remember'];
            $parts = explode('==', $remember_token);
            $user_id = $parts[0];
            $user = $db->query('SELECT * FROM users WHERE id = ?', [$user_id])->fetch();
            if($user){
                $expected = $user_id . '==' . $user->remember_token . sha1($user_id . 'ratonlaveurs');
                if($expected == $remember_token){
                    $this->connect($user);
                    setcookie('remember', $remember_token, time() + 60 * 60 * 24 * 7);
                } else{
                    setcookie('remember', null, -1);
                }
            }else{
                setcookie('remember', null, -1);
            }
        }
    }

    public function login($db, $username, $password, $remember = false){
        $user = $db->query('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL', ['username' => $username])->fetch();
        if(password_verify($password, $user->password)){
            $this->connect($user);
            if($remember){
                $this->remember($db, $user->id);
            }
            return $user;
        }else{
            return false;
        }
    }

    public function remember($db, $user_id){
        $remember_token = Str::random(250);
        $db->query('UPDATE users SET remember_token = ? WHERE id = ?', [$remember_token, $user_id]);
        setcookie('remember', $user_id . '==' . $remember_token . sha1($user_id . 'ratonlaveurs'), time() + 60 * 60 * 24 * 7);

    }

    public function logout(){
        setcookie('remember', NULL, -1);
        $this->session->delete('auth');
    }

    public function resetPassword($db, $email){
        $user = $db->query('SELECT * FROM users WHERE email = ? AND confirmed_at IS NOT NULL', [$email])->fetch();
        if($user){
            $reset_token = Str::random(60);
            $db->query('UPDATE users SET reset_token = ?, reset_at = NOW() WHERE id = ?', [$reset_token, $user->id]);
            mail($_POST['email'], 'Réinitiatilisation de votre mot de passe', "Afin de réinitialiser votre mot de passe merci de cliquer sur ce lien\n\nhttp://local.dev/Lab/Comptes/reset.php?id={$user->id}&token=$reset_token");
            return $user;
        }
        return false;
    }

    public function checkResetToken($db, $user_id, $token){
        return $db->query('SELECT * FROM users WHERE id = ? AND reset_token IS NOT NULL AND reset_token = ? AND reset_at > DATE_SUB(NOW(), INTERVAL 30 MINUTE)', [$user_id, $token])->fetch();
    }

}

Ha j'ai toujours le même probème
Notice: Trying to get property of non-object in C:\MAMP\PHP\GrafikArt\Espace membre\SouloufXYZ\membres\class\Auth.php on line 82

J'ai même utilisé le fichier du code source et toujours le même problème.quelqu'un aurait une solution s'il vous plait ?

5 réponses


Soulouf
Auteur
Réponse acceptée

Ha je ne vois pas appraître le nombre des lignes sur le code que je vous ai envoyé.
Je vous mets (au cas où) la partie du code concerné ^^

public function login($db, $username, $password, $remember = false){
        $user = $db->query('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL', ['username' => $username])->fetch();
        if(password_verify($password, $user->password)){
            $this->connect($user);
            if($remember){
                $this->remember($db, $user->id);
            }
            return $user;
        }else{
            return false;
        }
    }

Je vous remercie d'avance =)
PS : Ne m'en voulez pas pour mes erreurs, je ne suis qu'un novice. ^^

Carouge10
Réponse acceptée

Bonjour,

Avant de tester le password, il vous faut tester aussi que $user n'est pas vide.

Carouge10
Réponse acceptée

La vérification de $user n'y ai pas.

Avant de vérifier que le mot de passe et correcte. Il vous faut vérifier que l'utilisateur existe bien.

public function login($db, $username, $password, $remember = false){
        $user = $db->query('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL', ['username' => $username])->fetch();
        if( !empty($user) && password_verify($password, $user->password)){
            $this->connect($user);
            if($remember){
                $this->remember($db, $user->id);
            }
            return $user;
        }else{
            return false;
        }
    }
Soulouf
Auteur

Et mince j'ai cliqué sur résolu trop vite....
J'ai très bien suivi la vidéo à la lettre et j'ai même fait des copier coller après plusieurs erreurs et j'ai toujours autant le même peobkeme et je ne suis pas très fort en POO tout ceci est nouveau pour moi du coup je ne vois pas comment je peux savoir si j'ai mis la vérification du user (il me semble que oui mais cela reste à vérifier )

Soulouf
Auteur

Ha ouiiiii !! Je suis trop stupide ^^
Je te remercie beaucoup !!!