Реализация функционала запомнить меня

Продолжаем работать и усовершенствовать нашу форму авторизации. Если Вы прочитали предыдущие статьи, то у Вас уже должны быть созданы формы регистрации и авторизации с функционалом подтверждения адреса электронной почты и с возможностью восстановить забытый пароль.
А в этой статье мы добавим к нашей форме авторизации функционал " запомнить меня ", который избавит пользователя от требования пройти авторизацию при каждом входе на сайт. Данный функционал работает следующим образом: при первом входе на сайт, если пользователь поставит галочку " запомнить меня ", то, у него на компьютере, на некоторое время, сохранится кука с неким токеном. С помощью этой куки, при следующем входе на сайт, пользователь авторизуется автоматически.
Замечание! После скачивания архива с исходными файлами статьи, не забудьте поменять данные для подключения к базе данных и указать адрес Вашего сайта. Всё это нужно сделать в файле dbconnect.php.
Под следующим входом, имеется в виду, когда пользователь завершил работу на сайте и закрыл его, потом через некоторое время зашёл заново на сайт.
И так, первое что нам нужно сделать, это добавить сам чек бокс " Запомнить меня " в форму авторизации. Открываем файл " form_auth.php " и перед строкой с кнопкой " Войти " и ссылкой " Забыли пароль? " добавляем эту строку:
<tr> <td colspan="2" class="text_center" > <label> <input type="checkbox" name="remember_me" checked="checked" /> Запомнить меня </label> </td> </tr>
Идём дальше. Как мы знаем, обработчиком нашей формы является файл " auth.php ". Поэтому открываем его и перед тем как добавить данные авторизации в сессию, нужно добавить этот код:
//======= Обработка галочки " запомнить меня " ======= //Проверяем, если галочка была поставлена if(isset($_POST["remember_me"])){ //Создаём токен $password_cookie_token = md5($array_user_data["id"].$password.time()); //Добавляем созданный токен в базу данных $update_password_cookie_token = $mysqli->query("UPDATE users SET password_cookie_token='".$password_cookie_token."' WHERE email = '".$email."'"); if(!$update_password_cookie_token){ // Сохраняем в сессию сообщение об ошибке. $_SESSION["error_messages"] = "<p class='mesage_error' >Ошибка функционала 'запомнить меня'</p>"; //Возвращаем пользователя на страницу регистрации header("HTTP/1.1 301 Moved Permanently"); header("Location: ".$address_site."form_auth.php"); //Останавливаем скрипт exit(); } /* Устанавливаем куку. Параметры функции setcookie(): 1 параметр - Название куки 2 параметр - Значение куки 3 параметр - Время жизни куки. Мы указали 30 дней */ //Устанавливаем куку с токеном setcookie("password_cookie_token", $password_cookie_token, time() + (1000 * 60 * 60 * 24 * 30)); }else{ //Если галочка "запомнить меня" небыла поставлена, то мы удаляем куки if(isset($_COOKIE["password_cookie_token"])){ //Очищаем поле password_cookie_token из базы данных $update_password_cookie_token = $mysqli->query("UPDATE users SET password_cookie_token = '' WHERE email = '".$email."'"); //Удаляем куку password_cookie_token setcookie("password_cookie_token", "", time() - 3600); } } //место для добавления данных в сессию
Как Вы поняли, здесь мы обрабатываем чек бокс " Запомнить меня ". Если галочка была поставлена, то мы создаём куку, которая содержит некий токен. А если галочка не была поставлена, то мы удаляем созданную куку.
Кука добавляется в глобальный массив $_COOKIE. То есть в этом глобальном массиве создаётся ячейка, названия которой соответствует названием нашей куки.
Токен мы добавляем в базу данных, для того чтобы при следующем входе на сайт, мы смогли с помощью него вытащить нужные данные из базы.
Как мы знаем куки не безопасны для хранения данных, поэтому нельзя добавить в куку открытый пароль, потому что злоумышленник может украсть куки и с помощью них узнать данные для авторизации. Поэтому вместо пароля мы используем токен.
С первой частью мы закончили. Идём дальше. Представим, что пользователь поставил галочку " запомнить меня " и успешно авторизовался. Он погулял по сайту, написал пару комментариев и после этого вышел с сайта. Когда он заново зайдёт на сайт, то он должен авторизоваться автоматически, ведь он указал, чтобы его запомнили.
Так вот, для того чтобы организовать эту автоматическую авторизацию мы должны использовать куку с токеном. Нам нужно добавить код в тот файл, который подключается на всех страницах сайта, чтобы пользователя авторизовали с любой страницы. Вдруг он добавит, какую-ту страницу в закладках браузера.
Поэтому открываем файл " header.php " и в начале файла, сразу после функции запуска сессии, добавляем этот код:
//Добавляем файл подключения к БД require_once("dbconnect.php"); if(isset($_COOKIE["password_cookie_token"]) && !empty($_COOKIE["password_cookie_token"])){ $select_user_data = $mysqli->query("SELECT email, password FROM `users` WHERE password_cookie_token = '".$_COOKIE["password_cookie_token"]."'"); if(!$select_user_data){ echo "<p class='mesage_error' >Ошибка выборки БД.</p>".$mysqli->error(); }else{ $array_user_data = $select_user_data->fetch_array(MYSQLI_ASSOC); if($array_user_data){ $_SESSION['email'] = $array_user_data["email"]; $_SESSION['password'] = $array_user_data["password"]; } } }
Здесь мы проверяем, если кука с токеном существует и она не пуста, то мы делаем запрос к базе для выборки почтового адреса и пароля, где значение поля " password_cookie_token ", равна со значением куки " $_COOKIE["password_cookie_token"] ".
И если такая запись существует, то мы в сессию добавляем почтовый адрес и пароль указанного пользователя. Вот таким образом и сделали автоматическую авторизацию.
Это ещё не всё, остался один момент. При нажатии на кнопку " Выход ", мы должны удалить куку с токеном. Открываем файл " logout.php " и перед тем как удалить данные из сессии добавляем этот код:
//Добавляем файл подключения к БД require_once("dbconnect.php"); if(isset($_COOKIE["password_cookie_token"])){ $update_password_cookie_token = $mysqli->query("UPDATE users SET password_cookie_token = '' WHERE email = '".$_SESSION["email"]."'"); if(!$update_password_cookie_token){ echo "Ошибка ".$mysqli->error(); }else{ setcookie("password_cookie_token", "", time() - 3600); } }
Мы здесь проверяем, если существует кука с токеном, то мы очищаем поле " password_cookie_token " и запускаем механизм удаления самой куки с токеном.
Вот теперь всё. С функционалом " запомнить меня " мы закончили.
Замечание! После скачивания архива с исходными файлами статьи, не забудьте поменять данные для подключения к базе данных и указать адрес Вашего сайта. Всё это нужно сделать в файле dbconnect.php.
Похожие статьи:
Видео по теме:
Понравилась статья?
Тогда поделитесь ею с друзьями и подпишитесь на новые интересные статьи.
Поделиться с друзьями:
Подписаться на новые статьи:
Поддержите пожалуйста мой проект!
Если у Вас есть какие-то вопросы или предложения, то можете писать их в комментариях или мне на почту sergiu1607@gmail.com. И если Вы заметили какую-то ошибку в статье, то прошу Вас, сообщите мне об этом, и в ближайшее время я всё исправлю.
Добавляйтесь ко мне в друзья в:
Добавляйтесь в мои группы:
Подпишитесь на мои каналы:
Автор статьи: Мунтян Сергей
Копирование материалов с сайта sozdatisite.ru ЗАПРЕЩЕНО!!!
Дата добавления: 2017-08-07 17:09:16