código

Haciendo Login utilizando password_hash y password_verify

Para este ejemplo debemos considerar algunas factores:

  • Debemos tener una contraseña cifrada almacenada en una base de datos, en este caso utilizamos la palabra miclavesecreta. Una forma de hacerlos es utilizando la función password_hash (Crea un hash de contraseña) y el resultado obtenido es el que guardaremos en nuestra base de datos.
  • El punto anterior lo vimos en la publicación pasada donde utilizamos password_hash, strip_tags y html_entity_decode.
  • Para obtener el valor del campo anterior vamos a hacer una consulta con mysqli_query (Realiza una consulta a la base de datos), el cual no mostraremos en este ejemplo para hacerlo mas sencillo de comprender, pero en el código se mostrará en lugar donde se debe ejecutar.
  • Para la comprobación de la contraseña utilizaremos password_verify (Comprueba que la contraseña coincida con un hash), que de igual manera se mostrará en que momento utilizarla.

<?php session_start();  //inciamos sesión

//verificamos si esta saliendo de la sesión, ya veremos mas adelante como asignamos el valor.

if (isset($_GET['logout']) && $_GET['logout']==1) session_destroy();
$msg = 'Ingresa tus datos'; //mensaje según las acciones.
$muestraForm = true; // variable para decidir si mostramos el formulario
 
 //comprobamos si se ha pasado la contraseña y el usuario
if (isset($_POST['password']) && isset($_POST['usuario'])) {

  $usuarioPost = strip_tags(html_entity_decode($_POST['usuario'], ENT_NOQUOTES, "UTF-8"));
  $passwordPost = strip_tags(html_entity_decode($_POST['password'], ENT_NOQUOTES, "UTF-8")); // ejemplo 'miclavesecreta'

  /******************** 
   * en esta sección podemos hacer una consulta a nuestra base de datos con mysqli_query utilizando el usuario como condición y de la fila que obtenemos vamos  a hacer una comparación de valores del campo que contiene la contraseña.
   
  Una forma de obtener la clave sería  $password = $row['password'] ; * segun se llame el campo que la almacena, ya no necesitamos cifrarla porque cuando se guardó debimos hacerlo. Una forma de hacerlo es con password_hash, como lo hicimos en una publicación anterior.

   ejemplo:
   $password= strip_tags(html_entity_decode($_POST['password'], ENT_NOQUOTES, "UTF-8"));
   $valorParaGuardar = password_hash($password, PASSWORD_DEFAULT);
   
   entonces el valor que nos devuelve y que guardamos sería algo como  :
   $2y$10$QrSyPejWHpo0sxfd1ZnPTObKhIkv4VNQBcmz2SsbBGN/29nN9fhtu

   regresando al código, ya tenemos el valor guardado en la base de datos      
   **************************/

  $passwordCampo = $row['password'] ; // osea $2y$10$QrSyPejWHpo0sxfd1ZnPTObKhIkv4VNQBcmz2SsbBGN/29nN9fhtu
  // hacemos la comprobación del valor $_POST y del CAMPO   
  if (password_verify($passwordPost, $passwordCampo)) {
    $msg = 'Bienvenido';
    $PassOk = true; // asignamos un valor verdadero para que nos deje pasar a secciones privadas.
    $muestraForm = false; // no necesitamos mostrar el formulario
  }else{
    $msg 'password Invalido.'; // un mensaje mostrando que no coincidieron las claves
    //asignamos un valor negativo para el acceso a zonas restringidas
    $PassOk = false;     
  }
} // terminamos if si recibimos datos para hacer login


if ($PassOk) { 
  //accedemos al panel privado o mostramos contenido protegido.
  echo '<p>'.$msg.' Has accedido correctamente</p>'; 
  // mostramos el enlace para cerrar sesión
  echo '<p><a href="?logout=1">Cerrar Sesión</a></p>';   
}

if($muestraForm){
  //al no pasar contraseña enviamos al formulario de inicio
  echo '<h2>'.$msg.'</h2>
  <form name="form" method="post" action="">
    <label for="usuario">Usuario:</label><br>
    <input type="text" id="usuario" name="usuario" value=""><br>
    <label for="password">Contraseña:</label><br>
    <input type="password" id="password" name="password" value="">
    <input type="submit" value="Login">
  </form>';
}

?>

Este ejemplo es una continuación de la publicación Guardar registro con password_hash