Добавить аутентификацию в любое приложение PHP, использующее MySQL

PHP – это серверный язык сценариев с открытым исходным кодом, который можно встроить в HTML для создания веб-приложений. Он используется для разработки динамических веб-приложений и подключения приложения к базе данных.

В этом руководстве вы узнаете, как построить систему аутентификации с использованием баз данных PHP и MySQL. Мы ожидаем, что вы познакомитесь с основами PHP и MySQL, прежде чем приступить к работе.

Создание макета с использованием HTML и Bulma CSS

Внешний интерфейс этого проекта построен с использованием HTML и Bulma CSS . Bulma CSS – одна из популярных фреймворков CSS, используемых для разработки веб-страниц. Вы можете использовать Bulma CSS, импортировав миниатюрный CSS из CDN в свой файл PHP.

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

Интеграция базы данных MySQL

MySQL – это система управления реляционной базой данных SQL, используемая для выполнения операций CRUD с данными. Это веб-приложение будет использовать phpMyAdmin для управления базой данных.

phpMyAdmin – это бесплатный программный инструмент, написанный на PHP, предназначенный для администрирования MySQL через Интернет.

Вы можете установить phpMyAdmin , настроив сервер WAMP на вашем компьютере с Windows (или XAMPP в Linux ) и посетив следующий URL-адрес

 http://localhost/phpmyadmin

Экран будет выглядеть так:

Создание базы данных

Вы можете создать базу данных либо с помощью SQL-запросов, либо через графический интерфейс, предоставляемый phpMyAdmin . В этом приложении имя базы данных – auth, а имя таблицы – также users. Атрибуты таблицы: идентификатор, имя пользователя, адрес электронной почты и пароль.

Вот как вы можете создать базу данных и таблицу с помощью команд SQL:

Узнать больше: самые важные команды SQL, которые должен знать любой программист

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

Подключение приложения к базе данных

Создайте файл с именем db.php в папке вашего проекта, где вы подключите свою базу данных и импортируете этот файл в другие файлы PHP для его использования.

Соединение устанавливается с помощью метода mysqli_connect () . Этот метод принимает четыре аргумента: имя сервера, пользователя, пароль и имя базы данных.

Вы можете использовать переменную $ connection при выполнении запросов, импортировав файл db.php в другие файлы PHP.

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

Зарегистрироваться с помощью PHP

Первый этап построения системы аутентификации включает в себя регистрацию или подписку. Внешний вид страницы регистрации имеет форму с действием, которое выполняет запрос POST на странице. Он имеет четыре поля ввода: имя пользователя, адрес электронной почты, пароль и пароль для подтверждения.

 <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>

Метод isset () проверяет, нажата кнопка или нет, поскольку он может получить доступ к кнопке Register с помощью суперглобала $ _POST [] .

Перед всем этим вам необходимо импортировать файл db.php в файл register.php . Для проверки ввода объявлено несколько переменных. Ознакомьтесь с приведенным ниже кодом.

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

Проверка ввода на странице реестра

Прежде чем приступить к проверке ввода, вам необходимо получить доступ к значениям входных элементов с помощью $ _POST [] .

Метод mysqli_real_escape_string () помогает удалить специальные символы из строки, поскольку они могут вызывать вредоносные действия при выполнении операций запроса.

Связанный: Как реализовать проверку формы на стороне клиента с помощью 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";
}

Прежде всего, вы проверяете, пусты ли поля или нет. Для поля ввода электронной почты вам необходимо проверить, ввел ли пользователь действительный адрес электронной почты или нет, используя метод filter_var () . Длина поля пароля должна быть больше 6. Это основные проверки, о которых вам нужно позаботиться при создании любого приложения.

Если ошибок нет, вы можете продолжить выполнение команд запроса к файлу 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");
}

Вы должны запустить запрос, который проверяет, существует ли уже электронное письмо в базе данных или нет. Метод mysqli_query () используется для выполнения всех операций запроса. Вы должны передать результат запроса в методе mysqli_query_assoc () . Этот метод преобразует результат в ассоциативный массив строк.

Если пользователь уже существует, необходимо отобразить ошибку с сообщением: Пользователь уже существует. В противном случае вам нужно вставить поля в базу данных. Поскольку хранить строки паролей в открытом виде – не очень хорошая практика, метод md5 () преобразует пароль в хэш, а затем сохранит его.

После того, как пользователь будет сохранен в базе данных, вам необходимо загрузить имя пользователя или адрес электронной почты в суперглобал $ _SESSION [] и перенаправить пользователя на домашнюю страницу.

Взгляд на главный экран

Пользователь может получить доступ к домашней странице, только если он вошел в систему. На домашней странице вам нужно проверить, существует ли СЕССИЯ или нет. Если нет сеансовые, вам нужно перенаправить пользователя на страницу входа в систему .

Войти с помощью PHP

В этом приложении пользователь войдет в систему, используя адрес электронной почты и пароль. HTML-макет для 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>

Аутентификация пользователя

Вам необходимо проверить введенные данные аналогично тому, как это было сделано при регистрации пользователя.

 $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";
}

Если ошибок проверки нет, значения полей ввода будут запущены в запросе SQL. Чтобы получить хешированное значение пароля, передайте пароль в методе 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";
}
}

После получения хешированного пароля передайте электронное письмо и хешированный пароль в SQL-запросе и запустите его с помощью метода mysqli_query () .

После получения результата его необходимо передать в методе mysqli_num_rows () . Если метод mysqli_num_rows () возвращает значение 1, вы можете аутентифицировать пользователя.

Сохраните адрес электронной почты и имя пользователя в $ _SESSION [] и перенаправьте пользователя на домашнюю страницу.

Выйти из системы

Аутентификация пользователя выполняется с помощью суперглобала $ _SESSION [] . Чтобы выйти пользователю, вам нужно уничтожить сессию и перенаправить пользователя на login.php.

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

Безопасная система аутентификации важна

Вы уже научились добавлять систему аутентификации с помощью PHP и MySQL. Вы можете вывести этот проект на новый уровень, добавив к нему более продвинутые функции, или же интегрировать эту систему в крупномасштабный проект, такой как приложение для социальных сетей, страница блога или любой крупный проект. Продолжайте учиться и создавать новые вещи как можно больше.

Хотите узнать больше о PHP? Есть много манипуляций, которые вы можете проделать с правильным ноу-хау PHP.