Tengo un problema no puedo validar bien el login de usuarios me da problemas la contraseña.
El tema es que si valido 2 campos me funciona bien, el problema reside cuando quiero validar con la contraseña del usuario guardada en la BD... parece ser que no son iguales...
Es decir si cambio los parametros para que me compare usuario y nombre, usuario y salt, usuario y mail o lo que sea ingresa bien, pero cuando comparo usuario Y contraseña no hay forma.
Primero les muestro como guardo la contraseña al registrar un usuario
Código PHP:
public function registraUsuario()
{
try
{
//Creamos el salt aleatorio para la contraseña de 45 caracteres
$this->salt = generaSalt::crearSalt(45);
$this->_passencript = hash('sha256', $this->pass, $this->salt);
//Preparamos el query SQL
$sql = 'INSERT INTO usuarios (usuario, salt, contrasena, nombre, apellido, mail, telefono, tipo_usuario, id_local)'.
'VALUES (?,?,?,?,?,?,?,?,?)';
//Creamos la sentencia preparada a utilizar
$pre = $this->_con->prepare($sql);
$pre->bind_param('sssssssii', $this->usuario, $this->salt, $this->_passencript, $this->nombre, $this->apellido, $this->mail, $this->telefono, $this->tipousuario, $this->idlocal);
$pre->execute();
$this->_con->close();
$this->success = true;
return $this->success;
} catch (Exception $ex) {
return $ex->getMessage();
}
}
Código PHP:
public function __construct()
{
//Conectamos a la BD
$this->_con = new mysqli(DB_HOST, DB_USUARIO, DB_PASSWORD, DB_DATABASE);
//Filtramos todos los $_POST
$this->usuario = filter_input(INPUT_POST, 'usuario', FILTER_SANITIZE_SPECIAL_CHARS);
$this->pass = filter_input(INPUT_POST, 'pass', FILTER_SANITIZE_SPECIAL_CHARS);
$this->confpass = filter_input(INPUT_POST, 'confpass', FILTER_SANITIZE_SPECIAL_CHARS);
$this->nombre = filter_input(INPUT_POST, 'nombre', FILTER_SANITIZE_SPECIAL_CHARS);
$this->apellido = filter_input(INPUT_POST, 'apellido', FILTER_SANITIZE_SPECIAL_CHARS);
$this->telefono = filter_input(INPUT_POST, 'telefono', FILTER_SANITIZE_SPECIAL_CHARS);
$this->mail = filter_input(INPUT_POST, 'mail', FILTER_SANITIZE_EMAIL);
$this->tipousuario = filter_input(INPUT_POST, 'tipousr', FILTER_SANITIZE_NUMBER_INT);
$this->idlocal = filter_input(INPUT_POST, 'localid', FILTER_SANITIZE_NUMBER_INT);
}
//Funcion para login de usuarios
public function loginUsuario()
{
try
{
//Declaramos variable salt para el bind_result
$salt = null;
//Tomamos el salt para la contraseña
$sql_salt = 'SELECT salt FROM usuarios WHERE usuario = ? LIMIT 1';
$this->_salt_stmt = $this->_con->prepare($sql_salt);
$this->_salt_stmt->bind_param('s', $this->usuario);
$this->_salt_stmt->execute();
$this->_salt_stmt->bind_result($salt);
if($fila=$this->_salt_stmt->fetch())
{
$this->salt = $salt;
}
//Cerramos la conexion
$this->_salt_stmt->close();
//Creamos el hash para la contraseña
$this->_passencript = hash('sha256', $this->pass, $this->salt);
//Consulta de login
$sql = 'SELECT * FROM usuarios WHERE usuario = ? AND contrasena = ? LIMIT 1';
//Preparamos la sentencia para el login
$this->_stmt = $this->_con->prepare($sql);
$this->_stmt->bind_param('ss', $this->usuario, $this->_passencript);
$this->_stmt->execute();
$this->_stmt->bind_result($this->idusuario, $this->usuario, $this->salt, $this->pass, $this->nombre, $this->apellido, $this->mail, $this->telefono, $this->tipousuario, $this->idlocal, $this->esadmin, $this->puntos);
// Si exsiste el usuario guardamos la sesión
if ($this->_stmt->fetch())
{
$_SESSION = array(
'id'=> $this->idusuario,
'usuario'=>$this->usuario,
'nombre'=>$this->nombre,
'apellido'=>$this->apellido,
'mail'=>$this->mail,
'telefono'=>$this->telefono,
'tipousuario'=>$this->tipousuario,
'idlocal'=>$this->idlocal,
'esadmin'=>$this->esadmin,
'puntos'=>$this->puntos
);
//Cerramos la conexión
$this->_stmt->close();
// Cambiamos el valor de la variable comparadora a Verdadero
$this->success = true;
return $this->success;
}
Algo que ya probé fue pensar que tenía muy pocos caracteres en la columna contrasena en la BD ya que según había leido "sha256" crea 64 caracteres, así que borre los usuarios creados, y le di un ancho de 100 caracteres para la contraseña volví a crear los usuario, e intentar de nuevo el login y nada...
Bueno a ver si me pueden dar una mano.