Saltar a contenido

Autenticación

Inicio de sesión

Para manejar un sistema completo de login y password con contraseñas cifradas, necesitamos un método que cifre los datos que el usuario introduce como contraseña; tanto en el formulario de registro como en el del login, ya que al codificar una contraseña, después tenemos que decodificarla para comprobar que ambas contraseñas (la que introduce el usuario en el login y la que tenemos en la base de datos) coincidan.

Para ello, emplearemos las funciones:

  • password_hash() para almacenar la contraseña en la base de datos a la hora de hacer el INSERT

    • PASSWORD_DEFAULT almacenamos la contraseña usando el método de encriptación bcrypt

    • PASSWORD_BCRYPT almacenamos la contraseña usando el algoritmo CRYPT_BLOWFISH compatible con crypt()

  • password_verify() para verificar el usuario y la contraseña

Veamos un ejemplo:

¿De dónde sale la variable $conexion?

Recuerda que para realizar consultas a la base de datos utilizando PDO, necesitas tener configurado previamente el acceso a la base de datos.

Para ello, debes haber creado:

  1. Un archivo llamado constantes.php que contenga los datos de conexión:

    <?php
    define('DB_HOST', 'localhost');
    define('DB_NAME', 'nombre_de_tu_base_de_datos');
    define('DB_USER', 'root');
    define('DB_PASS', '');
    ?>
    

  2. Un archivo conexion.php que use esas constantes y cree la conexión PDO:

    <?php
    require_once 'constantes.php';
    
    try {
        $conexion = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASS);
        $conexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        die("Error en la conexión: " . $e->getMessage());
    }
    ?>
    

💡 Es recomendable haber trabajado esto previamente en la sesión de PDO, o incluirlo allí si aún no lo has hecho.

Todos los archivos de actividades que interactúan con la base de datos deben incluir al principio:

require_once 'conexion.php';
save.php
<?php

    $usu = $_POST["usuario"];
    $pas = $_POST["password"];

    $sql = "INSERT INTO usuarios(usuario, password) VALUES (:usuario, :password)";

    $sentencia = $conexion -> prepare($sql);

    $isOk = $sentencia -> execute([
        "usuario" => $usu,
        "password" => password_hash($pas,PASSWORD_DEFAULT)
    ]);

Ahora que tenemos el usuario codificado y guardado en la base de datos, vamos a recuperarlo para poder loguearlo correctamente.

login.php
<?php
    $usu = $_POST["login"] ?? "";

    $sql = "select * from usuarios where usuario = ?";

    $sentencia = $conexion -> prepare($sql);
    $sentencia -> execute([$usu]);

    $usuario = $sentencia -> fetch();

    if($usuario && password_verify($_POST['pass'], $usuario['password'])) {
        echo"OK!";
    } else {
        echo"KO";
    }

Actividad

  • 📝 AC 616. (RA6 / CE6b CE6c CE6d CE6e CE6f CE6g / IC1 / 3p) - Crea una tabla nueva dentro de la base de datos lol que ya tienes y crea un sistema de login con usuarios. Introduce en la base de datos al menos 3 usuarios diferentes con sus contraseñas distintas. Recuerda que:

    • La tabla nueva ha de llamarse usuario
    • Los campos a crear en la nueva tabla deben ser

      • id [*]
      • nombre
      • usuario
      • password
      • email
    • Las contraseñas deben ser cifradas antes de guardar el datos en la base de datos.

    • Crea el formulario donde el usuario introduzca los datos de registro y vincúlalo para que recoja los datos mediante POST y los inserte en la base de datos si todo ha ido bien.
    • No se ha de acceder a al archivo de nuevo usuario sin el formulario rellenado.
    • La sentencia de INSERT debe estar controlada para que no pueda introducirse ningún dato en blanco. Ten en cuenta que estás modificando la base de datos y no queremos campos mal rellenados.
    • Si todo ha ido bien, muestra un mensaje por pantalla diciendo El usuario XXX ha sido introducido en el sistema con la contraseña YYY.

    Estructura de ficheros

    Las aplicaciones van aumentando de complejidad, es el momento que empieces a pensar la estructura de ficheros antes de empezar a desarrollar. Es por ello que es recomendable separar las acciones en la mayor cantidad de ficheros posibles, pese a que esto aumente la complejidad de la gestión. Una buena documentación es clave.