Buenas, comunidad.
Estoy realizando un login con #jquery #ajax #php y #mysql
Al registrar al usuario, uso la función password_hash que viene por defecto con php y me registra a la perfección. me encripta la contraseña. El problema está cuando intento logearme con esa misma contraseña.
Para intentar logearme, uso la función password_verify que también viene con php, para comparar la contraseña que está enviando el usuario mediante el formulario con la que está en la base de datos. El problema es que me devuelve un "false" aunque la contraseña sea correcta.
Aquí les dejo el código:
Registro
signup.php
class Signup extends Controller {
public function __construct(){
parent::__construct();
}
public function render() {
$this->view->render('signup/signup');
}
public function signup(){
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
header('content-Type: application/json');
$name = $_POST['name'];
$lastName = $_POST['lastName'];
$email = $_POST['email'];
$pass = $_POST['pass'];
$options = ['memory_cost' => 1<<10, 'time_cost' => 4, 'threads' => 2];
$protpass = password_hash('$pass', PASSWORD_DEFAULT, $options);
if ($this->model->insert(["name" => $name, "lastName" => $lastName, "email" => $email, "protpass" => $protpass])) {
echo json_encode('true');
} else {
echo json_encode('false');
}
}
}
}
signupmodel.php
class SignupModel extends Model {
public function __construct() {
parent::__construct();
}
public function insert($datos){
try {
$email = $datos['email'];
$query = $this->db->connect()->prepare("SELECT * FROM user WHERE email = '$email' LIMIT 1");
$query->execute();
$fila = $query->fetch(PDO::FETCH_ASSOC);
if ($fila == 0) {
$insert = $this->db->connect()->prepare('INSERT INTO user (name, lastName, email, pass) VALUES (:name, :lastName, :email, :pass)');
$insert->execute([
'name' => $datos['name'],
'lastName' => $datos['lastName'],
'email' => $datos['email'],
'pass' => $datos['protpass']
]);
// return $insert;
return true;
}
} catch (PDOException $e) {
// return false;
echo $e->getLine();
echo $e->getMessage();
}
}
}
y, a partir de aquí, código para el login
login.html
<form class="form-signin" id="myFormulario">
<div class="text-center mb-4">
<h1 class="h3 mb-3 font-weight-normal">Login</h1>
</div>
<div class="form-label-group">
<input type="email" id="email" class="form-control" placeholder="Email address" required autofocus>
<label for="emial">Email address</label>
</div>
<div class="form-label-group">
<input type="password" id="pass" class="form-control" placeholder="Password" required>
<label for="pass">Password</label>
</div>
<div class="checkbox mb-3">
<label>
<input type="checkbox" value="remember-me"> Remember me
</label>
</div>
<button class="btn btn-lg btn-primary btn-block" id="log">Sign in</button>
<p class="mt-5 mb-3 text-muted text-center">© 2017-2019</p>
</form>
login.php //este es mi controlador, donde realizo algunas validaciones antes de hacer la consulta a la base de datos
class Login extends Controller {
public function __construct() {
parent::__construct();
}
public function render(){
$this->view->render('login/login');
}
public function login(){
if (!empty($_POST['email']) and !empty($_POST['pass'])) {
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
header('content-Type: application/json');
$email = $_POST['email'];
$pass = $_POST['pass'];
if ($this->model->getUser(["email" => $email, "pass" => $pass])) {
}
}
} else {
}
}
}
loginmodel.php //aquí realizo la consulta a la base de datos y compruebo el email y el password
class LoginModel extends Model {
public function __construct(){
parent::__construct();
}
public function getUser($data){
try {
$pass = $data['pass'];
$json = array();
$query = $this->db->connect()->prepare("SELECT name, lastName, email, pass FROM user WHERE email = :email LIMIT 1");
$query->execute(['email' => $data['email']]);
$row = $query->fetch(PDO::FETCH_ASSOC);
$pass2 = password_verify($pass, $row['pass']);
echo json_encode($pass2);
} catch (PDOException $e) {
echo $e->getMessage();
echo $e->getLine();
}
}
}
De ante mano, gracias por su ayuda...