Agregue autenticación a cualquier aplicación PHP usando MySQL

PHP es un lenguaje de programación del lado del servidor de código abierto que se puede incrustar en HTML para crear aplicaciones web. Se utiliza para desarrollar aplicaciones web dinámicas y conectar la aplicación a una base de datos.

En esta guía, aprenderá a crear un sistema de autenticación utilizando bases de datos PHP y MySQL. Esperamos que conozca los conceptos básicos de PHP y MySQL antes de comenzar.

Construyendo el diseño usando HTML y Bulma CSS

El front-end de este proyecto está construido usando HTML y Bulma CSS . Bulma CSS es uno de los marcos de CSS más populares que se utilizan para diseñar páginas web. Puede usar Bulma CSS importando el CSS minificado de la CDN a su archivo PHP.

 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/css/bulma.min.css">

Integración de la base de datos MySQL

MySQL es un sistema de administración de base de datos SQL relacional que se utiliza para realizar operaciones CRUD en los datos. Esta aplicación web utilizará phpMyAdmin para administrar la base de datos.

phpMyAdmin es una herramienta de software gratuita escrita en PHP, destinada a manejar la administración de MySQL a través de la web.

Puede instalar phpMyAdmin configurando un servidor WAMP en su máquina Windows (o XAMPP en Linux ) y visite la siguiente URL

 http://localhost/phpmyadmin

La pantalla se verá así:

Creando la base de datos

Puede crear la base de datos mediante consultas SQL o mediante la GUI proporcionada por phpMyAdmin . En esta aplicación, el nombre de la base de datos es auth y el nombre de la tabla también es users. Los atributos de la tabla son id, nombre de usuario, correo electrónico y contraseña.

Así es como puede crear la base de datos y la tabla usando comandos SQL:

Más información: los comandos SQL más importantes que cualquier programador debe conocer

 CREATE DATABASE auth;
CREATE TABLE users(
id int,
username varchar(255),
email varchar(255),
password varchar(500),
);

Conexión de la aplicación a la base de datos

Cree un archivo llamado db.php en la carpeta de su proyecto, donde conectará su base de datos e importará este archivo a otros archivos PHP para usarlo.

La conexión se establece mediante el método mysqli_connect () . Este método acepta cuatro argumentos: el nombre del servidor, el usuario, la contraseña y el nombre de la base de datos.

Puede usar la variable $ connection mientras ejecuta consultas importando el archivo db.php a otros archivos PHP.

 <?php
$connection = mysqli_connect("localhost", "root", "", "auth") ;
?>

Registrarse usando PHP

La primera fase de la construcción de un sistema de autenticación implica registrarse o registrarse. El diseño de la interfaz de la página de registro tiene un formulario con una acción que realiza una solicitud POST en la página. Tiene cuatro campos de entrada: nombre de usuario, correo electrónico, contraseña y confirmación de contraseña.

 <form class="card m-3 p-6 m-5 container mx-auto" action="./register.php" method="POST">

<h1 class="title is-1 has-text-center">Register Here</h1>
<input class="input is-primary mt-4" type="text" name="username" placeholder="Username">
<?php if ($usernameErrorMsg != "") echo "<p class='is-size-6 is-danger is-light has-text-danger'>$usernameErrorMsg</p>" ?>

<input class="input is-primary mt-4" type="email" name="email" placeholder="Email">
<?php if ($emailErrorMsg != "") echo "<p class='is-size-6 is-danger is-light has-text-danger'>$emailErrorMsg</p>" ?>

<input class="input is-primary mt-4" type="password" name="password" placeholder="Password">
<?php if ($passwordErrorMsg != "") echo "<p class='is-size-6 is-danger is-light has-text-danger'>$passwordErrorMsg</p>" ?>

<input class="input is-primary mt-4" type="password" name="confirm-password" placeholder="Confirm Password">
<?php if ($confirmPasswordErrorMsg != "") echo "<p class='is-size-6 is-danger is-light has-text-danger'>$confirmPasswordErrorMsg</p>" ?>

<button type="submit" name="submit" class="button is-primary mt-4">Register</button>
<p class="mt-2 text-center">Already have an account ? <a href="./login.php">Login</a></p>
</form>

El método isset () comprueba si se hace clic en el botón o no, ya que puede acceder al botón Registrar usando la superglobal $ _POST [] .

Antes de todo esto, debe importar el archivo db.php al archivo register.php . Hay un par de variables declaradas para la validación de entrada. Consulte el código a continuación.

 include "./db.php";
$error = "";
$emailErrorMsg = "";
$usernameErrorMsg = "";
$passwordErrorMsg = "";
$confirmPasswordErrorMsg = "";

Validación de entrada en la página de registro

Antes de continuar con la validación de entrada, necesita obtener acceso a los valores de los elementos de entrada usando $ _POST [] .

El método mysqli_real_escape_string () ayuda a eliminar los caracteres especiales de la cadena, ya que pueden causar acciones maliciosas al realizar operaciones de consulta.

Relacionado Cómo implementar la validación de formularios del lado del cliente con JavaScript

 $username = mysqli_real_escape_string($connection, $_POST["username"]);
$email = mysqli_real_escape_string($connection, $_POST["email"]);
$password = mysqli_real_escape_string($connection, $_POST["password"]);
$confirmPassword = mysqli_real_escape_string($connection, $_POST["confirm-password"]);
if($username == ""){
$usernameErrorMsg = "Please enter your username";
}
if($email == ""){
$emailErrorMsg = "Please enter the email";
}else if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
$emailErrorMsg = "Please enter a valid email";
}
if($password == ""){
$passwordErrorMsg = "Enter your password";
}
if($confirmPassword == ""){
$confirmPasswordErrorMsg = "Enter confirm password";
}
if(strlen($password) < 6){
$passwordErrorMsg = "Enter a password greater than 6 characters";
}else if($password!=$confirmPassword){
$confirmPasswordErrorMsg = "Password and Confirm Password field should be same";
}

En primer lugar, comprueba si los campos están vacíos o no. Para el campo de entrada de correo electrónico, debe verificar si el usuario ha ingresado un correo electrónico válido o no usando el método filter_var () . La longitud del campo de la contraseña debe ser superior a 6. Estas son las validaciones básicas que debe tener en cuenta al crear cualquier aplicación.

Si no hay errores, puede continuar con la ejecución de comandos de consulta en el archivo register.php .

 if($error == "" && $emailErrorMsg == "" && $passwordErrorMsg == "" && $confirmPasswordErrorMsg == ""){
$query = "SELECT * FROM auth WHERE email = '$email'";
$findUser = mysqli_query($connection, $query);
$resultantUser = mysqli_fetch_assoc($findUser);

if($resultantUser){
$error = "User already exists";
}
$password = md5($password);
$query = "INSERT INTO auth (username, email, password) VALUES('$username', '$email', '$password')";
$insertUser = mysqli_query($connection, $query);

$_SESSION['username'] = $username;
$_SESSION['email'] = $email;
header("location: home.php");
}

Debe ejecutar una consulta que verifique si el correo electrónico ya existe en la base de datos o no. El método mysqli_query () se utiliza para realizar todas las operaciones de consulta. Tienes que pasar el resultado de la consulta en el método mysqli_query_assoc () . Este método convierte el resultado en una matriz asociativa de cadenas.

Si el usuario ya existe, debe mostrar un error con el mensaje: El usuario ya existe. De lo contrario, debe insertar los campos en la base de datos. Como no es una buena práctica almacenar cadenas de contraseña en texto plano, el método md5 () convertirá la contraseña en un hash y luego la guardará.

Una vez que el usuario está almacenado en la base de datos, debe cargar el nombre de usuario o el correo electrónico en la superglobal $ _SESSION [] y redirigir al usuario a la página de inicio.

Una mirada a la pantalla de inicio

El usuario puede acceder a la página de inicio solo si ha iniciado sesión. En la página de inicio, debe verificar si la SESIÓN existe o no. Si no hay una SESIÓN configurada, debe redirigir al usuario a la página de inicio de sesión.

Iniciar sesión usando PHP

En esta aplicación, el usuario iniciará sesión con correo electrónico y contraseña. El diseño HTML para login.php :

 <form class="card m-3 p-6 m-5 container mx-auto" action="./login.php" method="POST">
<h1 class="title is-1 has-text-center has-text-black">Login Here</h1>
<?php if ($error != "") echo " <div class='button is-danger is-light'>$error</div>" ?>
<input class="input is-primary mt-4" name="email" type="email" placeholder="Email">
<?php if ($emailErrorMsg != "") echo "<p class='is-size-6 is-danger is-light has-text-danger'>$emailErrorMsg</p>" ?>

<input class="input is-primary mt-4" name="password" type="password" placeholder="Password">
<?php if ($passwordErrorMsg != "") echo "<p class='is-size-6 is-danger is-light has-text-danger'>$passwordErrorMsg</p>" ?>
<button class="button is-primary mt-4" type="submit" name="submit">Login</button>
<p>Don't have an account? <a href="./register.php">Register here</a></p>
</form>

Autenticar al usuario

Debe validar las entradas de manera similar a cómo se hizo al registrar al usuario.

 $email = mysqli_real_escape_string($connection, $_POST["email"]);
$password = mysqli_real_escape_string($connection, $_POST["password"]);
if($email == ""){
$emailErrorMsg = "Please enter the email";
}else if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
$emailErrorMsg = "Please enter a valid email";
}
if($password == ""){
$passwordErrorMsg = "Enter your password";
}

Una vez que no haya errores de validación, los valores de los campos de entrada se ejecutarán en la consulta SQL. Para obtener el valor hash de la contraseña, pase la contraseña en el método md5 () .

 if($emailErrorMsg == "" && $passwordErrorMsg == ""){
$password = md5($password);
$query = "SELECT * FROM users WHERE email = '$email' AND password='$password'";
$find_user = mysqli_query($connection, $query);
if(mysqli_num_rows($find_user) == 1){
$_SESSION["email"] = $email;
while($row = mysqli_fetch_assoc($find_user)){
$_SESSION["username"] = $row["username"];
}

header("location:home.php");
}else{
$error = "Invalid credentials";
}
}

Después de recuperar la contraseña hash, pase el correo electrónico y la contraseña hash en la consulta SQL y ejecútela usando el método mysqli_query () .

Al obtener el resultado, debe pasarlo en el método mysqli_num_rows () . Si el método mysqli_num_rows () devuelve el valor 1, entonces puede autenticar al usuario.

Guarde el correo electrónico y el nombre de usuario en $ _SESSION [] y redirija al usuario a la página de inicio.

Cerrar sesión del usuario

La autenticación de usuario se realiza mediante la superglobal $ _SESSION [] . Para cerrar la sesión del usuario, debe destruir la SESIÓN y redirigir al usuario a login.php .

 session_start();
$_SESSION = array();
session_destroy();
header("Location: login.php");
exit;

Un sistema de autenticación seguro es importante

Ya aprendió a agregar un sistema de autenticación usando PHP y MySQL. Puede llevar este proyecto al siguiente nivel agregándole funcionalidades más avanzadas o bien integrar este sistema en un proyecto a gran escala como una aplicación de redes sociales, una página de blog o cualquier proyecto importante. Siga aprendiendo y construyendo cosas nuevas tanto como pueda.

¿Quiere aprender más sobre PHP? Hay muchas manipulaciones que puede hacer con los conocimientos técnicos adecuados de PHP.