En este artículo vamos a explicar cómo podemos aplicar algunas mejoras y ampliaciones avanzadas a nuestro sistema de login. Hasta ahora, nuestro sistema de login ya es funcional, seguro y permite la gestión de sesiones y niveles de acceso. En este último artículo vamos a ver qué mejoras y ampliaciones avanzadas podemos implementar para que el sistema sea aún más completo, profesional y amigable para el usuario.
Este artículo forma parte de la serie Sistema de login con PHP, donde se explica paso a paso cómo construir un sistema completo de login de usuarios usando PHP y MySQL.
Recuperación de contraseñas
Cuando un usuario olvida su contraseña, es importante ofrecer un mecanismo seguro de recuperación. Para ello podemos proceder de la siguiente manera:
Paso 1 – Formulario de recuperación: Podemos reutilizar parte de nuestro sistema de login para ofrecer un formulario de recuperación de contraseñas mediante el email que se ha utilizado para registrarse.
<form action="recuperar.php" method="POST">
<input type="email" name="email" placeholder="Introduce tu correo" required>
<button type="submit">Recuperar contraseña</button>
</form>
Paso 2 – Generar token seguro: Si el email existe en nuestra base de datos, significa que efectivamente se trata de un usuario registrado. En este caso, reutilizamos parte de nuestro sistema para generar un enlace de recuperación mediante un token único para este usuario. El código podría ser algo como esto:
<?php
require "conexion.php";
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email) {
$token = bin2hex(random_bytes(32));
$expira = date('Y-m-d H:i:s', strtotime('+1 hour'));
$sql = "UPDATE usuarios SET reset_token = ?, reset_expira = ? WHERE email = ?";
$stmt = mysqli_prepare($con, $sql);
mysqli_stmt_bind_param($stmt, "sss", $token, $expira, $email);
mysqli_stmt_execute($stmt);
// Enviar email con enlace
$link = "https://tudominio.com/reset-password.php?token=$token";
mail($email, "Recuperar contraseña", "Haz clic aquí para resetear tu contraseña: $link");
}
?>
Con esto, nuestro sistema de login con sus mejoras y ampliaciones avanzadas ofrece un entorno de recuperación de contraseñas seguro.
- El script recibe el email enviado por el usuario desde un formulario y lo valida para asegurarse de que realmente tiene formato de correo electrónico. Si no es válido, simplemente no continúa.
- Se crea un token aleatorio y criptográficamente seguro, que será el identificador único para el enlace de recuperación. También se genera una fecha de expiración: el token solo será válido durante 1 hora, lo cual es una buena práctica de seguridad.
- Se actualiza la tabla
usuariosy asigna dos valores al usuario cuyo email coincide:- reset_token: el token generado
- reset_expira: cuándo caduca el token
- Esto sirve para que, más adelante, la página
reset-password.phppueda buscar al usuario usando el token, asegurar que existe y comprobar que no ha caducado. - Finalmente se construye un enlace que contiene el token como parámetro GET. El usuario recibirá un email con ese enlace y, cuando lo abra, será dirigido a
reset-password.php.
Paso 3 – Validar token y actualizar contraseña: En reset-password.php, se verifica que el token exista y no haya expirado antes de permitir cambiar la contraseña con password_hash(). Aunque no se muestra en el código, el flujo sería:
- Obtener
$_GET['token']. - Buscar en la base de datos un usuario cuyo
reset_tokencoincida. - Verificar que
reset_expirano haya pasado. - Permitir que el usuario establezca una nueva contraseña.
- Invalidad el token tras usarlo (reset_token = NULL).
Recordar sesión
Dentro de las mejoras y ampliaciones avanzadas de nuestro sistema de login, podemos permitir que el usuario permanezca conectado, incluso tras cerrar el navegador mediante cookies seguras. En este caso podemos hacer algo parecido a lo siguiente:
if (isset($_POST['recordar'])) {
$selector = bin2hex(random_bytes(8));
$validator = bin2hex(random_bytes(32));
$hashedValidator = password_hash($validator, PASSWORD_DEFAULT);
$expira = date('Y-m-d H:i:s', strtotime('+30 days'));
// Guardar selector y hashedValidator en la base de datos
$sql = "INSERT INTO auth_tokens (user_id, selector, token, expira) VALUES (?, ?, ?, ?)";
$stmt = mysqli_prepare($con, $sql);
mysqli_stmt_bind_param($stmt, "isss", $_SESSION['user_id'], $selector, $hashedValidator, $expira);
mysqli_stmt_execute($stmt);
// Guardar en cookie
setcookie("remember", "$selector:$validator", time() + 30*24*60*60, "/", "", true, true);
}
- Este bloque de código solo se ejecuta si el usuario ha marcado la casilla de “Recordarme” en el formulario de login. Si no la marca, no se crea ningún token persistente.
- Se generan los dos elementos clave del sistema de “Recordarme”:
- selector: identificador público para localizar la fila en la base de datos.
- validator: clave secreta que se envía al usuario.
- hashedValidator: versión hasheada del validator que se guarda en la base de datos.
- expira: fecha de caducidad del token (30 días).
- Esto evita ataques: si un atacante roba la base de datos, solo verá el hash, no el validator real.
- Se inserta un nuevo registro en la tabla
auth_tokenscon:- user_id: el usuario que ha iniciado sesión.
- selector: para identificar su token.
- token: el hash del validator.
- expira: hasta cuándo es válido.
- Esta tabla permite gestionar múltiples dispositivos o sesiones recordadas.
- Finalmente se envía al navegador una cookie con hash, nunca guarda el validator real.
Cuando el usuario vuelva a la página, haremos lo siguiente:
- El navegador enviará la cookie.
- El servidor buscará por selector.
- Comparará el validator usando
password_verify(). - Si coincide, la sesión se restaura automáticamente.
Estas mejoras y ampliaciones avanzadas permiten que la cookie dure 30 días, sea secure (solo funciona con HTTPS) y httponly protege la cookie frente a JavaScript. Al iniciar sesión, si no hay sesión activa, se puede verificar la cookie y recrear la sesión automáticamente.
Integración con APIs o login externos
Hay algunas mejoras y ampliaciones avanzadas en el sistema de login que se extienden a otras aplicaciones, pero que también son muy útiles. Si quieres permitir que los usuarios se conecten con Google, Facebook u otros servicios podemos proceder de la siguiente manera:
- Registrar tu aplicación en el proveedor OAuth.
- Obtener
client_idyclient_secret. - Redirigir al usuario al login externo y recibir un token seguro.
- Validar token en el servidor y crear la sesión local del usuario.
Esto permite login social, muy cómodo para usuarios y seguro si sigues el flujo oficial del proveedor.
Mejoras y ampliaciones avanzadas
En este artículo hemos aprendido a implementar una serie de mejoras y ampliaciones avanzadas que elevan tu sistema de login a un nivel totalmente profesional. Comenzamos añadiendo un sistema seguro de recuperación de contraseña mediante tokens temporales, evitando exponer datos sensibles y garantizando que solo el propietario legítimo pueda restablecer su clave. Del mismo modo, implementamos la funcionalidad de “Recordar sesión” utilizando cookies seguras y protegidas, que permiten al usuario iniciar sesión automáticamente sin comprometer la seguridad del sistema.
Dentro del las mejoras y ampliaciones avanzadas que podemos programar, podemos añadir la posibilidad de integrar OAuth. Que ofrece un inicio de sesión o registro mediante plataformas externas como Google o Facebook, lo que simplifica la experiencia del usuario y reduce la carga de gestión de contraseñas en tu sistema.
Por último, hemos repasado un conjunto de buenas prácticas de seguridad y protección general, necesarias para asegurar que tu sistema de login se mantenga estable, eficiente y resistente en entornos reales. Con todas estas medidas aplicadas, tu sistema de autenticación en PHP se convierte en una solución completa, segura y moderna preparada para su uso en entornos reales.
¡ Espero que este artículo sea de vuestro interés !