Foros del Web » Programando para Internet » PHP »

Login con password_verify

Estas en el tema de Login con password_verify en el foro de PHP en Foros del Web. Buenas, Resulta que estoy intentando implementar la función password_verify() en un login, he realizado ya varias pruebas con resultado negativo y no sé que es ...
  #1 (permalink)  
Antiguo 01/03/2016, 07:37
 
Fecha de Ingreso: febrero-2016
Mensajes: 17
Antigüedad: 8 años, 2 meses
Puntos: 0
Login con password_verify

Buenas,

Resulta que estoy intentando implementar la función password_verify() en un login, he realizado ya varias pruebas con resultado negativo y no sé que es lo que puedo estar haciendo mal. En todos los intentos me entra en el mensaje "No existe este usuario o la contraseña es incorrecta.", saliendo un error estilo "Trying to get property of non-object in C:\wamp\www\Pelipedia\login.php on line 205" Ya me he cerciorado de que los campos de la tabla sean los correctos, y no sé porque no captura los datos para iniciar las sesiones. ($_SESSION['userid'] = $result->idusuario; y $_SESSION['name'] = $result->usuario;)

La contraseña la he codificado en la parte del registro tal que así:

Código PHP:
Ver original
  1. define("HASH_COST_FACTOR", "10");
  2. $hash_cost_factor = (defined('HASH_COST_FACTOR') ? HASH_COST_FACTOR : null);
  3. $user_password_hash = password_hash($contra, PASSWORD_DEFAULT, array('cost' => $hash_cost_factor));

Ingresando el $user_password_hash en la BBDD.

Este es el código del login:

Código PHP:
Ver original
  1. <?php
  2.  
  3. if($_POST){
  4. $nombre=$_POST['nombre']; //Campo del formulario verificado
  5. $contra=$_POST['contra']; //Campo del formulario verificado
  6. $base= new PDO('mysql:host=localhost; dbname=pelipedia','root','');
  7. $base->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  8.  
  9. function verificar_login($user,$password,&$result)
  10.     {
  11.         try
  12.         {
  13.               $base= new PDO('mysql:host=localhost; dbname=pelipedia','root','');
  14.                   $base->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  15.           $base->exec("SET CHARACTER SET utf8");
  16.               $sql="SELECT * FROM usuarios WHERE (usuario = :usu OR mail = :usu)";
  17.               $resultado=$base->prepare($sql);
  18.               $resultado->execute(array(":usu"=>$user));
  19.                   $count = 0;
  20.                   while($registro=$resultado->fetch(PDO::FETCH_ASSOC)){
  21.                            $count++;
  22.                            $result = $registro;
  23.                    }
  24.                   if($count == 1 && password_verify($password,$result['password'])) {
  25.                             return 1;
  26.                    } else {
  27.                             return 0;
  28.                    }
  29.           $resultado->closeCursor();
  30.  
  31.                }catch(Exception $e) {
  32.               die("Error: " . $e->getMessage() . "<br>Código del error: " . $e->getCode() . "<br>Línea: " . $e->getLine());
  33.            }
  34.        
  35.     } // function verificar_login()
  36.  
  37.  
  38. /*Luego haremos una serie de condicionales que identificaran el momento en el boton de login es presionado y cuando este sea presionado llamaremos a la función verificar_login() pasandole los parámetros ingresados:*/
  39.  
  40. if(!isset($_SESSION['userid'])) //para saber si existe o no ya la variable de sesión que se va a crear cuando el usuario se logee
  41. {
  42.     if(isset($_POST['login'])) //Si la primera condición no pasa, haremos otra preguntando si el boton de login fue presionado
  43.     {
  44.     if(verificar_login($nombre,$contra,$result) == 1) //Si el boton fue presionado llamamos a la función    verificar_login() dentro de otra condición preguntando si resulta verdadero y le pasamos los valores ingresados como parámetros.
  45.         {    
  46.             $_SESSION['userid'] = $result->idusuario;
  47.         $_SESSION['name'] = $result->usuario;
  48.             header("location:login.php");
  49.  
  50.         } else { ?>
  51.                         <script>
  52.              $(".registro").hide().delay(1000);
  53.              $("#alert").show("slide", { direction: "left" }, 1000).html("<div class='hay'><p>No existe este usuario o la contraseña es incorrecta.</p></div>").delay(3000);
  54.             window.location.href='login.php';
  55.                        </script>
  56.          <?php }
  57.     } //isset($_POST['login']
  58.  
  59. } else {
  60.       echo 'Su usuario ingreso correctamente.';
  61.       echo '<a href="logout.php">Logout</a>';
  62.       header("location:index.php");
  63.        }
  64. }  ?> //If ($_POST)

A ver si me podéis ayudar, muchas gracias de antemano. Tambíén serán bienvenidas formas más fáciles de hacer login, la base la cogí de un ejemplo (venía con la función validar_login incluída) y la he ido adaptando a mis necesidades.

Última edición por Keysersozer; 01/03/2016 a las 07:45
  #2 (permalink)  
Antiguo 01/03/2016, 08:16
 
Fecha de Ingreso: febrero-2016
Mensajes: 17
Antigüedad: 8 años, 2 meses
Puntos: 0
Respuesta: Login con password_verify

Me autorespondo, acabo de averiguar donde estaba el problema...Al pegarlo de otro ejemplo era posible que se me olvidara cambiar algo:

Código PHP:
Ver original
  1. $_SESSION['userid'] = $result['idusuario'];
  2. $_SESSION['name'] = $result['usuario'];

Ahora tengo el siguiente problema. Al verificar el login, quiero que aparezca en pantalla un alert en forma de div y que me redireccione a la página principal si se ha verificado bien la contra. Pues bien, lo he implementado con jQuery y resulta que se me ejecuta antes el PHP (los 'echo' para averiguar si he entrado en un lugar u otro) y no me aparece el div.

Este es el código:

Código PHP:
Ver original
  1. <?php
  2. if(verificar_login($nombre,$contra,$result) == 1) //Si el boton fue presionado llamamos a la función verificar_login() dentro de otra condición preguntando si resulta verdadero y le pasamos los valores ingresados como parámetros.
  3.         {
  4.  
  5.                   $_SESSION['userid'] = $result['idusuario'];
  6.           $_SESSION['name'] = $result['usuario'];
  7.                   echo "He iniciado las sesiones";
  8. ?>
  9.              <script>
  10.            
  11.              $(".registro").hide().delay(1000);
  12.              $("#alert").show("slide", { direction: "left" }, 1000).html("<div class='success'><p>Te has logueado correctamente. Bienvenido" + <?php echo $_SESSION['name']; ?> + ".</p></div>").delay(3000);
  13.             window.location.href='index.php';
  14.            
  15.                 </script>
  16. <?php
  17.            
  18.            
  19.            header("location:login.php");
  20.  
  21.        } else {
  22.  
  23.              echo "Password incorrecto";
  24. ?>
  25.  
  26.              <script>
  27.              $(".registro").hide().delay(1000);
  28.              $("#alert").delay(1000).show("slide", { direction: "left" }, 1000).html("<div class='hay'><p>No existe este usuario o la contraseña es incorrecta.</p></div>").delay(3000);
  29.             window.location.href='login.php';
  30.         </script>
  31. <?php
  32.         }
  33.    } .....

¿Qué estoy haciendo mal? Muchas gracias de antemano.
  #3 (permalink)  
Antiguo 01/03/2016, 14:15
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 20 años, 5 meses
Puntos: 154
Respuesta: Login con password_verify

Hola Keysersozer,

Ese es el comportamiento lógico, PHP se ejecuta en el servidor y devuelve el código HTML, Javascript o el que sea según se le haya programado, por eso te muestra los echo antes que los div.

Etiquetas: formulario, html, login, registro, select, sql, tabla, usuarios, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:51.