Цвет

PHP Авторизация

129₽ 169₽

Категории:

phplogin

В этом гайде мы научимся авторизировать пользователей и оставлять cookie файл с сохраненным пользователем.

Этот гайд является продолжением гайда по регистрации на PHP, но всё будет понятно и так.

Для начала, для локального сервера мы будем пользоваться программой XAMPP, в качестве текстового редактора будет использоваться VSCode.

После установки XAMPP откройте его от имени администратора. И запустите первые 2 службы Apache и mySQL

Заходим в панель phpmyadmin по ссылке http://localhost/phpmyadmin

Создайте новую базу данных в нажав на "New"

Далее создаем таблицу из 5 столбцов.

Должно быть 5 колонок:

id - первая колонка любой таблицы, отметьте A_I (auto increment), будет повышаться автоматически.

login - логин пользователя

hLogin - хэшированный логин, который мы будем хранить в файле куки, с небольшими изменениями

hPassword - хэшированный пароль, обычная практика хранить пароль в зашифрованном виде в таблице.

email - email пользователя

После того, как настроили таблицу, нажимаем Save, чтобы сохранить таблицу

Если вы прошли гайд по регистрации на PHP, то можете использовать её.

Если вы НЕ проходили гайд, то кликнув по таблице users в панели phpmyadmin, нажмите сверху на Insert (вставить) и впишите следующие данные, их мы используем для теста:

id - Ничего не пишем
login - admin
hLogin - cbde9c28f0b9500bc15dea0e4da1e835d36896ed0aac434d678e6d5bbcd77087
hPassword - adeadba8a01625f482b8aae221b7df73adeea3f3465577dfacadef3d997eda85a82dcd4e1b2f74a898d073368be506f7 (root123)
email - my_email@gmail.com

И нажимаем Go, чтобы добавить запись.

Отлично, теперь переходим к написанию кода

Создаем в папке xampp>>htdocs нашу папку с сайтом. Пример: mywebsite.ru

В ней мы создаем файл

login.php

Здесь мы будем писать наш код

Не забудьте, сайт доступен по ссылке http://localhost/mywebsite.ru/login.php

Для начала создаем базовую структуру в нажем php файле

<html>
   <head>
    </head>
   <body>
   </body>
</html>

В body нам нужно создать форму, где будут вводиться данные. У нее будет метод post и аттрибут action = "index.php".

<form method='post' id='loginForm' action="login.php" style='margin: 200px 0 0 0; text-align: center;'>
   <h2>Авторизация</h2>
   <p><input id='login' name='login' type="text" placeholder='Логин' style='font-size:18px; width: 350px;margin: 5px 0 10px 0;'></p>
   <p><input id='password' name='password' type="password" placeholder='Пароль' style='font-size:18px; width: 350px;margin: 5px 0 10px 0;'></p>
   <p><input id='btn' name='btn' type='submit' value='Войти' style='font-size:18px; width: 350px;margin: 5px 0 10px 0;'></p>
</form>

Мы сразу обернули инпуты в тег p для лучших стилей. Считывать данные из них мы будем через метод POST по имени инпута.

После формы пишем наш код PHP. Сначала считываем нажатую кнопку по имени кнопки с методом POST

if(isset($_POST['btn'])){

}

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

if(isset($_POST['btn'])){
   $errors = [];
   if(preg_match("/[^a-zA-Z0-9]/",$_POST['login'])){
     array_push($errors,'Неправильный формат логина.');
   }
   if(strlen($_POST['login'])<3){
     array_push($errors,'Длина логина от 3 до 25 символов.');
   }
   else if(strlen($_POST['login'])>25){
     array_push($errors,'Длина логина от 3 до 25 символов.');
   }
   if(strlen($_POST['password'])<5){
     array_push($errors,'Пароль должен быть от 5 символов.');
   }

Дальше, если список ошибок пуст, мы будем хэшировать данные и узнаем, есть ли записи с таким логином в нашей таблице

if(empty($errors)){
    $salt = 'my_word123';
    $login = $_POST['login'];
    $login = strtolower($login);
    $hPassword = $salt . $_POST['password'];
    $hPassword = hash('sha384', $hPassword);
    $query = "SELECT hLogin, hPassword FROM users WHERE login='$login'";
    $result = mysqli_query($connection, $query);
    ......

Если записей не найдено, выводим ошибку

if (mysqli_num_rows($result) == 0){
   echo '<p style="color:#bf375e;text-align:center;margin: 5px 0 5px 0; font: 20px;font-size: 22px;">Такого аккаунта не существует</p>';
}

Если записи найдены, сравниваем введённые данные, с данными в таблице.

else{
   $arr = mysqli_fetch_assoc($result);
   if($arr['hPassword']==$hPassword){
       $hLogin = $salt . $login;
       $hLogin = hash('sha256', $login);
       setcookie('User',$hLogin , time()+60*60*24*365);
       echo '<p style="color:#2a8c06;text-align:center;margin: 5px 0 5px 0; font: 20px;font-size: 22px;">Успешный вход.</p>';
     echo '<p style="color:#2a8c06;text-align:center;margin: 5px 0 5px 0; font: 20px;font-size: 22px;">Куки создан.</p>';
   }
   else{
       echo '<p style="color:#bf375e;text-align:center;margin: 5px 0 5px 0; font: 20px;font-size: 22px;">Неверный пароль.</p>';
   }
}
}

С помощью функции setcookie() мы создаем куки файл с хэшем логина, с помощью него можно будет идентифицировать пользователя

Помните, как мы проверяли на ошибки наши поля? Так вот, нам нужно их вывести в случае, если они найдены

else{ //If $errors not empty
   for ($i=0; $i < count($errors); $i++){
     echo '<p style="color:#bf375e;text-align:center;margin: 5px 0 5px 0; font: 20px;font-size: 22px;">'. $errors[$i] .'</p>';
   }
}
}