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

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

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

Исходный архив, который содержит файлы, созданные в предыдущие статьи, Вы можете скачать по этой ссылке .

А в этой статье мы добавим к нашей форме авторизации функционал " запомнить меня ", который избавит пользователя от требования пройти авторизацию при каждом входе на сайт. Данный функционал работает следующим образом: при первом входе на сайт, если пользователь поставит галочку " запомнить меня ", то, у него на компьютере, на некоторое время, сохранится кука с неким токеном. С помощью этой куки, при следующем входе на сайт, пользователь авторизуется автоматически.

Замечание! После скачивания архива с исходными файлами статьи, не забудьте поменять данные для подключения к базе данных и указать адрес Вашего сайта. Всё это нужно сделать в файле 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.

Похожие статьи:

Видео по теме:

Понравилась статья?

Тогда поделитесь ею с друзьями и подпишитесь на новые интересные статьи.

Поделиться с друзьями:

Подписаться на новые статьи:

Delivered by FeedBurner

Поддержите пожалуйста мой проект!

<< Предыдущая статьяСледующая статья >>

Если у Вас есть какие-то вопросы или предложения, то можете писать их в комментариях или мне на почту sergiu920@mail.ru. И если Вы заметили какую-то ошибку в статье, то прошу Вас, сообщите мне об этом, и в ближайшее время я всё исправлю.

Добавляйтесь ко мне в друзья в:

Добавляйтесь в мои группы:

Подпишитесь на мои каналы:

Автор статьи: Мунтян Сергей

Копирование материалов с сайта sozdatisite.ru ЗАПРЕЩЕНО!!!

Дата добавления: 2017-08-07 13:09:16