matheusbattisti / curso_php

Arquivos do curso de PHP do Hora de Codar.
572 stars 124 forks source link

Não consgio logar #2

Open marcioaquilles opened 1 year ago

marcioaquilles commented 1 year ago

Olá Mateus na parte do authprocess de usuario e senha sempre dar erro usuario e senha nã encontrados, pois o metodo está retornando um valor falso. e não entra no if do metodo autenthicate vou mandar o codigo pra me ajudar.

<?php

include_once "globals.php"; include_once "pdo.php"; include_once "IUserController.php"; include_once "models/User.php"; include_once "models/Message.php"; include_once "Controller/UserController.php";

$message = new \models\Message($BASE_URL); $userController = new \Controller\UserController($conn, $BASE_URL);

//Resgata o tipo de formulário. $filter = filter_input(INPUT_POST, "type"); //echo $filter;

//Verifica o tipo de formulário. if ($filter === "register") {

//    Dados recebidos do POST.
$name = filter_input(INPUT_POST, "name", FILTER_SANITIZE_STRING);
$lastname = filter_input(INPUT_POST, "lastname", FILTER_SANITIZE_STRING);
$email = filter_input(INPUT_POST, "email", FILTER_SANITIZE_EMAIL);
$password = filter_input(INPUT_POST, "password", FILTER_SANITIZE_STRING);
$confirmPassword = filter_input(INPUT_POST, "confirmpassword", FILTER_SANITIZE_STRING);

/* A função anônima $validate é definida como uma variável e verifica o comprimento da senha passada como argumento usando strlen e retorna true se for maior ou igual a $minLength, ou false caso contrário.*/
$validate = function ($password) {
    $minLength = 8;
    return strlen($password) >= $minLength;
};

//    Verificacao de dados minimos.
if ($name && $lastname && $email && $password) {

    //  Verificando se as senhas são iguais.
    if ($password === $confirmPassword) {
        if ($validate($password)) { //Verificando o comprimento da senha.
            if ($userController->findByEmail($email) === false) { //Verificando se o e-mail já existe.
                // Criação de token e senha
                $user = new \models\User();

                $userToken = $user->generateToken();
                $finalPassword = $user->generatePassword($password);

                $user->setName($name);
                $user->setLastname($lastname);
                $user->setEmail($email);
                $user->setPassword($finalPassword);
                $user->setToken($userToken);

                $auth = true;

                $userController->create($user, $auth);
            } else {
                $message->setMessage("Usuário já cadastrado no sistema. Por favor, tente outro e-mail", "msg-error", "back");
            }
        } else {
            $message->setMessage("Senha deve ter no minimo 8 caracteres", "msg-error", "back");
        }
    } else {
        $message->setMessage("Senhas não correspondem. Por favor, verifique as senhas digitadas", "msg-error", "back");
    }
} else {
    // Envio de mensagem de erro, caso os dados estejam incompletos no formulário.
    $message->setMessage("Por favor, preencha todos os campos.", "msg-error", "back");
}

} else if ($filter === "login") {

$email = filter_input(INPUT_POST, "email", FILTER_SANITIZE_EMAIL);
$password = filter_input(INPUT_POST, "password", FILTER_SANITIZE_STRING);

$verifyUSer = $userController->authenticateUser($email, $password);

echo '<pre>';
    var_dump($email);
    var_dump($password);
    var_dump($verifyUSer);
echo '</pre>';

// Tenta autenticar usuário
if ($userController->authenticateUser($email, $password)) {

    var_dump($email);
    var_dump($password);

    $message->setMessage("Seja bem vindo!", "msg-sucess", "back");

} //else /// Redireciona o usuário caso não consiga autenticar

// // $message->setMessage("Usuário e/ou e senha inválido!", "msg-error", "back"); // }

} else {

$message->setMessage("Informações inválidas!", "msg-error", "index.php");

}

<?php

namespace Controller;

use models\User; use models\Message; use IUserController;

include_once 'IUserController.php'; include_once 'models/Message.php'; include_once 'models/User.php';

class UserController implements \IUserController { private $conn; private $url; private $message;

/**
 * @param $conn
 * @param $url
 */
public function __construct(\PDO $conn, $url)
{
    $this->conn = $conn;
    $this->url = $url;
    $this->message = new Message($url);
}

public function buildUser($data)
{
    if (!is_array($data) || empty($data)) {
        // Se $data não for um array ou estiver vazio, retorna null ou uma mensagem de erro.
        return null; // ou throw new Exception("Mensagem de erro");
    }

    // Verifica se todas as chaves necessárias estão definidas no array.
    $requiredKeys = array('id', 'name', 'lastname', 'email', 'password', 'image', 'bio', 'token');
    $missingKeys = array_diff($requiredKeys, array_keys($data));
    if (!empty($missingKeys)) {
        // Se estiver faltando alguma chave, retorna null ou uma mensagem de erro.
        return null; // ou throw new Exception("Mensagem de erro");
    }

    // Se todas as verificações passarem, continua a criação do objeto $user.
    $user = new User();

    // Verifica se o objeto foi inicializado corretamente antes de chamar os métodos.
    if (!($user instanceof User)) {
        // Se o objeto não for uma instância da classe User, retorna null ou uma mensagem de erro.
        return null; // ou throw new Exception("Mensagem de erro");
    }

    // Se todas as verificações passarem, continua a criação do objeto $user.

    $user->setId($data['id']);
    $user->setName($data['name']);
    $user->setLastname($data['lastname']);
    $user->setEmail($data['email']);
    $user->setPassword($data['password']);
    $user->setImage($data['image']);
    $user->setBio($data['bio']);
    $user->setToken($data['token']);

    return $user;
}

public function create(\models\User $user, $authUser = false)
{
    try {
        $stmt = $this->conn->prepare("INSERT INTO users (name, lastname, email, password, token) VALUES (
        :name, :lastname, :email, :password, :token)");
        $stmt->bindValue(":name", $user->getName());
        $stmt->bindValue(":lastname", $user->getLastname());
        $stmt->bindValue(":email", $user->getEmail());
        $stmt->bindValue(":password", $user->getPassword());
        $stmt->bindValue(":token", $user->getToken());
        $stmt->execute();

        // Autenticação do usuário
        if ($authUser) {
            $this->setTokenToSession($user->getToken());
        }
    } catch (\ErrorException $exception) {
        echo "Erro encontrado: " . $exception->getMessage();
    }
}

public function update(\models\User $user, $redirect = true)
{
    try {

        $stmt = $this->conn->prepare("UPDATE users SET (name, lastname, email, image, bio, token) VALUES (
        :name, :lastname, :email, :image, :bio, :token) WHERE id = :id");
        $stmt->bindValue(":name", $user->getName());
        $stmt->bindValue(":lastname", $user->getLastname());
        $stmt->bindValue(":email", $user->getEmail());
        $stmt->bindValue(":image", $user->getImage());
        $stmt->bindValue(":bio", $user->getBio());
        $stmt->bindValue(":token", $user->getToken());
        $stmt->bindValue(":id", $user->getId());
        $stmt->execute();

        if ($redirect) {
            // Redirecionar para o perfil do usuário
            $this->message->setMessage("Dados atualizados com sucesso!", "msg-sucess", "editprofile.php");
        }

    } catch (\ErrorException $exception) {

        echo "Erro encontrado: " . $exception->getMessage();

    }
}

public function verifyToken($protected = false)
{
    if (!empty($_SESSION['token'])) {

        //Pega o token da sessão
        $token = $_SESSION['token'];

        $user = $this->findByToken($token);

        if ($user) {

            return $user;

        } else if ($protected) {

            // Redirecionar para o perfil do usuário
            $this->message->setMessage("Faça a autenticação para acessar essa página", "msg-error", "index.php");
        }
    } else if ($protected) {

        // Redirecionar para o perfil do usuário
        $this->message->setMessage("Faça a autenticação para acessar essa página", "msg-error", "index.php");
    }
}

public function setTokenToSession($token, $redirect = true)
{
    // Salvar token na session.
    $_SESSION['token'] = $token;

    if ($redirect) {
        // Redirecionar para o perfil do usuário
        $this->message->setMessage("Seja vem vindo!", "msg-sucess", "editprofile.php");
    }
}

public function authenticateUser($email, $password)
{
    $user = $this->findByEmail($email);

    if($user) {

        // Checar se as senhas batem
        if(password_verify($password, $user->getPassword())) {

            // Gerar um token e inserir na session
            $token = $user->generateToken();

            $this->setTokenToSession($token, false);

            // Atualizar token no usuário
            $user->token = $token;

            $this->update($user, false);

            return true;

        } else {

            return false;
        }

    } else {

        return false;
    }
}

public function findByToken($token)
{
    if ($token != "") {
        try {
            $stmt = $this->conn->prepare("SELECT * FROM users WHERE token = :token");
            $stmt->bindValue(":token", $token);
            $stmt->execute();

            if ($stmt->rowCount() > 0) {

                $data = $stmt->fetch();
                $user = $this->buildUser($data);

                return $user;

            } else {
                return false;
            }
        } catch (\ErrorException $exception) {
            echo "Erro encontrado: " . $exception->getMessage();
        }
    } else {
        return false;
    }
}

public function destroyToken()
{
    //Remove o token da sessão
    $_SESSION['token'] = "";

    // Redireciona e a presenta a mensagem de sucesso
    $this->message->setMessage("Sessão encerrada com sucesso!", "msg-sucess", "index.php");
}

public function findByEmail($email)
{
    if ($email != "") {
        try {
            $stmt = $this->conn->prepare("SELECT * FROM users WHERE email = :email");
            $stmt->bindValue(":email", $email);
            $stmt->execute();

            if ($stmt->rowCount() > 0) {
                $data = $stmt->fetch();
                $user = $this->buildUser($data);
            } else {
                return false;
            }
        } catch (\ErrorException $exception) {
            echo "Erro encontrado: " . $exception->getMessage();
        }
    } else {
        return false;
    }
}

public function findById($id)
{
    // TODO: Implement findById() method.
}

public function changePassword(\models\User $user)
{
    // TODO: Implement changePassword() method.
}

}

<?php

namespace models;

class User { private $id; private $name; private $lastname; private $email; private $password; private $image; private $bio; private $token;

/**
 * @return mixed
 */
public function getId()
{
    return $this->id;
}

/**
 * @param mixed $id
 */
public function setId($id): void
{
    $this->id = intval($id);
}

/**
 * @return mixed
 */
public function getName()
{
    return $this->name;
}

/**
 * @param mixed $name
 */
public function setName($name): void
{
    $this->name = $name;
}

/**
 * @return mixed
 */
public function getLastname()
{
    return $this->lastname;
}

/**
 * @param mixed $lastname
 */
public function setLastname($lastname): void
{
    $this->lastname = $lastname;
}

/**
 * @return mixed
 */
public function getEmail()
{
    return $this->email;
}

/**
 * @param mixed $email
 */
public function setEmail($email): void
{
    $this->email = $email;
}

/**
 * @return mixed
 */
public function getPassword()
{
    return $this->password;
}

/**
 * @param mixed $password
 */
public function setPassword($password): void
{
    $this->password = $password;
}

/**
 * @return mixed
 */
public function getImage()
{
    return $this->image;
}

/**
 * @param mixed $image
 */
public function setImage($image): void
{
    $this->image = $image;
}

/**
 * @return mixed
 */
public function getBio()
{
    return $this->bio;
}

/**
 * @param mixed $bio
 */
public function setBio($bio): void
{
    $this->bio = $bio;
}

/**
 * @return mixed
 */
public function getToken()
{
    return $this->token;
}

/**
 * @param mixed $token
 */
public function setToken($token): void
{
    $this->token = $token;
}

public function generateToken()
{
    return bin2hex(random_bytes(50));
}

public function generatePassword($password)
{
    return password_hash($password, PASSWORD_DEFAULT);
}

}

marcioaquilles commented 1 year ago

Olá pode me ajudar?

duds-la commented 1 year ago
public function authenticateUser($email, $password) {
    $user = $this->findByEmail($email);
    if($user) {
        // Checar se as senhas batem
        if(password_verify($password, $user->getPassword())) {
            // Gerar um token e inserir na session
            $token = $user->generateToken();
            $this->setTokenToSession($token, false);

            // Atualizar token no usuário
            $user->setToken($token);
            $this->update($user, false);

            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }
}

Tenta isso, acho que vai resolver seu problema 😉