Como están?
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();
}
}
para empezar la funcion de login de usuario está en la clase Usuario
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;
}
Bueno si imprimo el salt que tomo de la BD para realizar el hash de la contraseña me lo muestra perfectamente es decir que lo toma bien. Es el mismo salt utilizado para crear la contraseña al momento de crear el usuario. Pero no hay forma no me identifica las contraseñas como iguales. Reitero si cambio el campo a comprobar y pongo usuario y cualquier otro valor de la fila de la Base de Datos, se valida perfecto el usuario y se inicializa la sesion.
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.