Crear un recordar contraseña usando PHP

Tiempo de lectura: 3 minutos

Hola, hoy os voy a enseñar cómo crear un recordar contraseña usando PHP + HTML.

Primero, crea una tabla en tu base de datos para almacenar los datos de los usuarios, incluyendo sus contraseñas. La tabla podría tener los siguientes campos: id, nombre, email y contraseña.

CREATE TABLE usuarios (
  id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(30) NOT NULL,
  email VARCHAR(50) NOT NULL,
  contrasena VARCHAR(255) NOT NULL
);

2. Crea una página en tu sitio web donde los usuarios puedan introducir su dirección de correo electrónico para solicitar la recuperación de su contraseña.

<!DOCTYPE html>
<html>
<head>
	<title>Recuperar contraseña</title>
</head>
<body>
	<h1>Recuperar contraseña</h1>
	<form action="recuperar-contrasena.php" method="post">
		<label for="email">Introduce tu correo electrónico:</label>
		<input type="email" id="email" name="email" required>
		<button type="submit">Enviar</button>
	</form>
</body>
</html>

3. Cuando el usuario envía el formulario, PHP debería verificar si el correo electrónico proporcionado está en la base de datos. Si no se encuentra, muestra un mensaje de error al usuario. De lo contrario, genera un token único y lo almacena en la base de datos para ese usuario.

$email = $_POST['email'];

$sql = "SELECT id FROM usuarios WHERE email = '$email'";
$resultado = mysqli_query($conexion, $sql);

if (mysqli_num_rows($resultado) == 0) {
	// El correo electrónico no está registrado en la base de datos
	echo "Lo siento, ese correo electrónico no está registrado en nuestra base de datos.";
	exit;
}

// El correo electrónico es válido, generar un token y almacenarlo en la base de datos

Generación del token:

$token = bin2hex(random_bytes(32));

$id_usuario = // Obtener el ID del usuario desde la base de datos

$sql = "UPDATE usuarios SET token = '$token' WHERE id = $id_usuario";
mysqli_query($conexion, $sql);

// Enviar el correo electrónico con el token

4. Envía un correo electrónico al usuario con un enlace que contenga el token generado en el paso anterior. El enlace debería llevar al usuario a una página donde puedan restablecer su contraseña.

$to = $email;
$subject = "Recuperar contraseña";
$message = "Para restablecer tu contraseña, haz clic en el siguiente enlace: https://tu-sitio-web.com/restablecer-contrasena.php?token=$token";
$headers = "From: Tu Sitio Web <noreply@tu-sitio-web.com>\r\n";
$headers .= "Reply-To: Tu Sitio Web <noreply@tu-sitio-web.com>\r\n";
$headers .= "Content-type: text/html\r\n";

mail($to, $subject, $message, $headers);

5. Cuando el usuario hace clic en el enlace enviado por correo electrónico, se dirige a la página de restablecimiento de contraseña. Esta página debe verificar que el token proporcionado sea válido y esté asociado con un usuario en la base de datos.

$token = $_GET['token'];

$sql = "SELECT id FROM usuarios WHERE token = '$token'";
$resultado = mysqli_query($conexion, $sql);

if (mysqli_num_rows($resultado) == 0) {
	// El token no es válido o ha expirado
	echo "Lo siento, el token proporcionado no es válido o ha expirado.";
	exit;
}

// El token es válido, mostrar el formulario para restablecer la contraseña

6. Si el token es válido, muestra un formulario donde el usuario pueda introducir una nueva contraseña.

Cuando el usuario envía el formulario, PHP debería actualizar la contraseña en la base de datos y eliminar el token asociado con el usuario.

<!DOCTYPE html>
<html>
<head>
	<title>Restablecer contraseña</title>
</head>
<body>
	<h1>Restablecer contraseña</h1>
	<form action="guardar-contrasena.php" method="post">
		<input type="hidden" name="token" value="<?php echo $token; ?>">
		<label for="contrasena">Nueva contraseña:</label>
		<input type="password" id="contrasena" name="contrasena" required>
		<label for="confirmar_contrasena">Confirmar contraseña:</label>
		<input type="password" id="confirmar_contrasena" name="confirmar_contrasena" required>
		<button type="submit">Guardar contraseña</button>
	</form>
</body>
</html>

Por último, muestra un mensaje de confirmación al usuario de que su contraseña ha sido actualizada con éxito. Y la guarda en base de datos:

$token = $_POST['token'];
$contrasena = $_POST['contrasena'];
$confirmar_contrasena = $_POST['confirmar_contrasena'];

$sql = "SELECT id FROM usuarios WHERE token = '$token'";
$resultado = mysqli_query($conexion, $sql);

if (mysqli_num_rows($resultado) == 0) {
	// El token no es válido o ha expirado
	echo "Lo siento, el token proporcionado no es válido o ha expirado.";
	exit;
}

// El token es válido, actualizar la contraseña del usuario
$id_usuario = mysqli_fetch_assoc($resultado)['id'];

if ($contrasena != $confirmar_contrasena) {
	// Las contraseñas no coinciden
	echo "Las contraseñas no coinciden. Inténtalo de nuevo.";
	exit;
}

$contrasena_encriptada = password_hash($contrasena, PASSWORD_DEFAULT);

$sql = "UPDATE usuarios SET contrasena = '$contrasena_encriptada', token = NULL WHERE id = $id_usuario";
mysqli_query($conexion, $sql);

echo "¡Tu contraseña ha sido actualizada exitosamente!";

Este tutorial es solo una guía básica para implementar un sistema de recordar contraseña en PHP. Te recomendamos que sigas las mejores prácticas de seguridad y validación de datos para evitar vulnerabilidades en tu aplicación.

Deja un comentario