Бонус: Server-Side API Requests
Библиотека redux-oauth поддерживает Server Side API requests, то есть в процессе рендеринга сервер может сам обратиться к API за данными. Это имеет множество преимуществ:
- сервер находится гораздо ближе к API, а значит пользователь получит доступ к контенту быстрее;
- для некачественного мобильного интернета уменьшение количества запросов имеет решающее значение в вопросах производительности из-за большого latency каждого запроса;
- поисковики не умеют или плохо умеют JavaScript, а значит иначе они не получат доступ к полноценному контенту.
Примечание: да, поисковики не будут авторизовываться, но некоторые сервисы API смогут возвращать данные и для неавторизованных пользователей с некоторыми ограничениями. redux-oauth подойдет и для таких сценариев.
Реализуем небольшой Proof of Concept.
Добавим запрос к API в серверную часть нашего приложения
src/server.js
После того, как функция initialize из redux-oauth обратится к backend, проверит авторизационный токен и получит данные о пользователе, мы выполним запрос timeRequest на стороне сервера. После его выполнения мы отрендерим контент и отдадим ответ пользователю.
Откроем браузер, авторизуемся при необходимости, перейдем на страницу «Время» и нажмем F5. Мы должны увидеть timestamp, хотя кнопку «Запросить» никто не нажимал. Если открыть Dev Tools браузера, вкладку Network и повторить эксперимент, то мы увидим, что запроса к API из клиента не было. Это подтверждает, что вся работа была сделана на стороне сервера.
Внесем последнее небольшое улучшение в наш проект: будем делать запрос к API только в том случае, если пользователь авторизован.
src/redux/actions/timeActions.js
Как мы видим, внутри возвращаемой функции мы можем получить доступ к актуальному глобальному состоянию посредством вызова функции getState, которая будет передана вторым аргументом. Об этом далеко не все знают, а это очень полезная возможность.
Расширения mysql и mysqli
PHP предлагает на выбор разработчику два расширения для работы с базами данных MySQL. Расширение mysql предоставляет процедурный интерфейс и предназначено для использования с MySQL версии 4.1.3 или более ранними версиями. Его также можно использовать и с более свежими версиями СУБД, но в этом случае многие возможности сервера, появившиеся после версии 4.1.3, будут недоступны программисту.
Расширение mysqli, или как его еще называют улучшенное (improved) MySQL расширение, было разработано, чтобы дать возможность программистам в полной мере воспользоваться функционалом MySQL сервера версий 4.1.3 и выше. Расширение mysqli включается в поставку PHP версий 5 и выше. mysqli имеет ряд преимуществ и усовершенствований по сравнению с mysql, которые заключаются в следующем:
-
Объектно-ориентированный интерфейс;
-
Поддержка подготавливаемых запросов;
-
Поддержка мультизапросов;
-
Поддержка транзакций;
-
Улучшенные возможности отладки;
-
Поддержка встроенного сервера.
Наравне с объектно-ориентированным расширение предоставляет и процедурный интерфейс. В последующих примерах я буду использовать расширение mysqli, т.к. mysql является устаревшим.
functions.php
Самый большой файл из всех в данной статье, содержит все функции. Приведу исходный код а потом прокомментирую каждую функцию.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
<?phpfunction connectToDB() { global $link, $dbhost, $dbuser, $dbpass, $dbname; ($link = mysql_pconnect(«$dbhost», «$dbuser», «$dbpass»)) || die(«Couldn’t connect to MySQL»); mysql_select_db(«$dbname», $link) || die(«Couldn’t open db: $dbname. Error if any was: «.mysql_error() );} function newUser($login, $password) { global $link; $query=»INSERT INTO users (login, password) VALUES(‘$login’, ‘$password’)»; $result=mysql_query($query, $link) or die(«Died inserting login info into db. Error returned if any: «.mysql_error()); return true;} function displayErrors($messages) { print(«<b>Возникли следующие ошибки:</b>\n<ul>\n»); foreach($messages as $msg){ print(«<li>$msg</li>\n»); } print(«</ul>\n»);} function checkLoggedIn($status){ switch($status){ case «yes» if(!isset($_SESSION»loggedIn»)){ header(«Location: login.php»); exit; } break; case «no» if(isset($_SESSION»loggedIn») && $_SESSION»loggedIn» === true ){ header(«Location: members.php»); } break; } return true;} function checkPass($login, $password) { global $link; $query=»SELECT login, password FROM users WHERE login=’$login’ and password=’$password’»; $result=mysql_query($query, $link) or die(«checkPass fatal error: «.mysql_error()); if(mysql_num_rows($result)==1) { $row=mysql_fetch_array($result); return $row; } return false;} function cleanMemberSession($login, $password) { $_SESSION»login»=$login; $_SESSION»password»=$password; $_SESSION»loggedIn»=true;} function flushMemberSession() { unset($_SESSION»login»); unset($_SESSION»password»); unset($_SESSION»loggedIn»); session_destroy(); return true;} function field_validator($field_descr, $field_data, $field_type, $min_length=»», $max_length=»», $field_required=1) { global $messages; if(!$field_data && !$field_required){ return; } $field_ok=false; $email_regexp=»^(+)@((\{1,3}\.{1,3}\.{1,3}\.)|»; $email_regexp.=»((+\.)+))({2,4}|{1,3})(\]?)$»; $data_types=array( «email»=>$email_regexp, «digit»=>»^$», «number»=>»^+$», «alpha»=>»^+$», «alpha_space»=>»^+$», «alphanumeric»=>»^+$», «alphanumeric_space»=>»^+$», «string»=>»» ); if ($field_required && empty($field_data)) { $messages = «Поле $field_descr является обезательным»; return; } if ($field_type == «string») { $field_ok = true; } else { $field_ok = ereg($data_types$field_type, $field_data); } if (!$field_ok) { $messages = «Пожалуйста введите нормальный $field_descr.»; return; } if ($field_ok && ($min_length > )) { if (strlen($field_data) < $min_length) { $messages = «$field_descr должен быть не короче $min_length символов.»; return; } } if ($field_ok && ($max_length > )) { if (strlen($field_data) > $max_length) { $messages = «$field_descr не должен быть длиннее $max_length символов.»; return; } }}?> |
А теперь по порядку
- function connectToDB() — служит для подключения к базе данных
- function newUser($login, $password) — служит для создания нового пользователя в системе
- function displayErrors($messages) — выводит массив ошибок
- function checkLoggedIn($status) — проверяет авторизацию пользователя.
- function checkPass($login, $password) — проверяет пользователя по БД во время авторизации
- function cleanMemberSession($login, $password) — авторизует пользователя
- function flushMemberSession() — выход, или если вам будет удобнее logout
- function field_validator($field_descr, $field_data, $field_type, $min_length=»», $max_length=»», $field_required=1) — Валидатор данных, проверяет соответствие полей требованиям системы
Работу каждой функции я описывать не буду, т.к. они довольно простые, в данный момент нас интересует только логика. Если будут вопросы — спрашивайте.
3.3. Заменяем заглушку в timeActions.js
src/redux/actions/timeActions.js
Функция fetch из redux-oauth — это расширенная функция из пакета isomorphic-fetch. Согласно документации, ее необходимо вызывать через dispatch, так как в этом случае у нее будет доступ к глобальному состоянию, из которого она сможет считать авторизационный токен и отправить его вместе с запросом. Если функцию fetch использовать для произвольного HTTP-запроса, а не запроса к API, то авторизационный токен использован не будет, то есть алгоритм ее выполнения на 100% совпадет с алгоритмом выполнения isomorphic-fetch.
Примечание: isomorphic-fetch — это библиотека, которая умеет делать HTTP-запросы как из браузера, так и из Node окружения.
Откроем браузер и еще раз нажмем на кнопку «Запросить» страницы «Время». Что ж, мы больше не видим текущий timestamp, зато в redux-dev-tools появилась информация о 401 ошибке. Неудивительно, ведь мы должны быть авторизованы, чтобы API нам что-то вернул.
Безопасная система авторизации
Однако, данная схема имеет недостаток — пароль используется в открытом виде, а это небезопасно. Всё что идёт дальше — только для ознакомления, пока это слишком сложно реализовать без хорошей архитектуры и полноценной базы данных.
Хеширование паролей
В более совершенных системах авторизации используют хеш от пароля.
Если по-простому, то это такое вычисленное значение, полученное в результате выполнения над паролем определенных манипуляций. В результате этих действий мы получаем строку, из которой нельзя восстановить исходный пароль.
Но мы можем снова повторить над паролем те же действия и сравнить получившиеся значения. То есть сравниваются хеши, а не исходные пароли. И в базе данных тоже хранят хеши, а после того как от клиента пришел пароль в открытом виде, вычисляют его хэш и сравнивают со значением в базе. Если они равны — значит от пользователя пришел верный пароль.
Для чего это делается? Да просто потому, что если сайт будет каким-то образом взломан, то злоумышленник в базе данных не найдёт паролей в открытом виде — только хеши. А так как из хеша получить пароль довольно сложно (при условии, что хеш-функция надежна и используется надёжный пароль), то пароль он не узнает. Следовательно:
- злоумышленник не сможет использовать пароль для входа на взломанный сайт;
- он также не сможет использовать этот пароль для входа под тем же логином и паролем в другие места (ведь довольно часто люди используют одинаковые пароли для всего).
Вычисляются хеши с помощью хеш-функции. Хеш-функции при этом вычисляют хеши следуя алгоритмам хеширования. Сейчас в PHP для хеширования следует использовать функцию password_hash(), а для проверки хеша — password_verify(). Если вы в каком-то уроке увидите, что для хеширования паролей используется md5 — бегите оттуда, такие хеши вскрываются за несколько минут, она устарела ещё лет 10 назад.
Авторизационные токены
Помимо хеша пароля в базе данных так же принято хранить так называемые авторизационные токены (AuthToken). Это комбинация символов (желательно подлиннее и с кучей кракозябр), которая генерируется при успешной авторизации пользователя и сохраняется в базе данных. А ещё она и пользователю отправляется.
И потом пользователь с помощью cookie передает этот токен на сервер, где он сравнивается со значением в базе данных. Если они равны, то считаем пользователя авторизованным. Для чего? Дело в том, что куки могут быть похищены злоумышленниками (очень многими способами, не будем об этом в этой статье, кому интересно — погуглите). И если злоумышленнику попадет в руки токен — он не сможет получить исходный пароль
О том, почему это так важно, я уже объяснил
Create Database Table
A table is required to store account details in the database. The following SQL creates a table in the MySQL database.
CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `first_name` varchar(25) COLLATE utf8_unicode_ci NOT NULL, `last_name` varchar(25) COLLATE utf8_unicode_ci NOT NULL, `email` varchar(50) COLLATE utf8_unicode_ci NOT NULL, `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `phone` varchar(15) COLLATE utf8_unicode_ci NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '1=Active | 0=Block', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Ошибка авторизации
Ошибка авторизации – неверное введение логина, пароля и других данных
При наборе кодовых слов, пользователь должен обращать внимание на правильный порядок символов, регистр, установленную раскладку клавиатуры. При ошибке авторизации система блокирует посетителя доступ к системе и может производить такие действия:
- фиксацию факта несанкционированного доступа;
- подачу звукового или светового сигнала, выдачу сообщения на экран;
- ограничение доступа на определенное время;
- предложение повторного набор кода;
- восстановление пароля;
- блокирование банковской кредитной карты, пропуска.
Заполняем index.php
Сразу в первой строке сделаем пробел от <?php и пишем:
(Прошу прощения за ошибку. Ранее было указано core.php:)
- Строкой <?php мы объявили что пишем код php.
- Строкой require_once мы Требуем файл что-бы он запустился 1 раз.
- В скобках мы указываем путь до требуемого файла. Две точки в пути ../ указывают на предыдущий каталог. То есть, если наш файл находится в /auth, то он выполняется тут же, а точки ../ говорят что он должен вернутся назад в предыдущую папку. Далее, файл открывает папку engine и ищет config.php внутри. Например:
../ Это вернутся на одну папку назад
../../ Это вернутся на две папки назад
../../../ Это на три. Суть надеюсь уловили
?> объявляем о завершении кода PHP. Начинается выполнение HTML.
Разметка HTML
Код ниже, это стандартная пустая разметка HTML. Добавим её в наш index.php
Как мы любим, разжёвываем всё по пунктам:
- <!doctype html> – Объявляем что тип документа HTML,
- <html lang=»ru»> – Открыт HTML тег. Язык русский.
- <head> – Открыт тег головы сайта. Внутри этого тега мы должны подключать стили, иконки шрифты и т.д
- <title> Заголовок </title> – Тег Тайтл (заголовок) открыт. Внутри пишем имя страницы. Закрываем тег Title и за одно head.
- <body> – Откроем тег Body. С англ. переводится как тело. Да, правильно поняли. Внутри этого контейнера должно располагаться то, что пользователь будет видеть на экране браузера.
- Соответственно, закрываются теги body а затем html.
PHP это грубо говоря дополнение к HTML. Сейчас мы сделаем кое что.
По любому вы будете добавлять дизайн и нам нужно сделать так, чтобы у Вас было всё «по красоте».
Над тегом <title> сделаем отступ и потребуем файл head.php который в папке engine.
Внутри добавляйте свои параметры, такие как:
(P.S Я сказал что эти уроки для тех, кто уже знаком с HTML и я начинаю Вас подтягивать + то, что вам не нужно. Простите!!!)
Так! Мы подключили head.php и осталось дело за малым.
Сделаем меню. Я хочу чтобы было меню с ссылками. Всё время создавать код и менять его на каждой странице не удобно, очень! Отныне, мы создадим php файл и будем его подключать через include. В добавок ещё подключим наш content.php где будем хранить нашу форму для входа и на всякий случай сделаем файл где будет хранится «подвал (footer)» сайта.
Внутри тегов <body> пишем:
Внутри navbar.php я написал следующий код:
После сохранения файлик отправился на сервер и вот что получилось:
Готово! Открываем content.php и заполняем формами:
Надеюсь, вы понимаете что это. Через поле name мы будем отправлять POST запрос. Наши поля должны соответствовать тем, что записаны в БД (базе данных). Login и Password. Эти поля нужны нам для входа. Логин и Пароль. Их браузер запомнит в сессию. button это кнопка type (тип) submit. То есть когда введён логин и пароль, по нажатию на кнопку, форма отправится.
Приступим к выполнению PHP кода
Вставим следующий код:
Снова объясню построчно:
Открываем переменную $login = $_POST[‘Login‘];. Она нужна для получения POST запроса который сделала форма которую мы сделали.
То же самое и с паролем $password = $_POST[‘Password‘];. Этот пароль передаётся в чистом виде, он не зашифрован. Знающий человек сможет перехватить его, но можно защитить пароль. Вместо функции выше, мы зашифруем с помощью стандартной функции
Да, молодцы, заменяем!
Далее, чистое условие на инглише:
Если вы не авторизованы, то выполняем авторизацию по форме. (Подчеркнул)
Иначе выкидываем Вас на главную. (Квадрат)
Далее
isset – это функция проверки на существование. Наши переменные, как мы помним выше, логин и пароль, проверяют их на существование в сессии. То есть, например, чтобы Login был равен = тому который был указан в форме авторизации.
Далее.
Если результат не равен данным в базе, выведем сообщение об ошибке используя функцию echo.
Далее.
Иначе, если мы существуем, то добавим нас в сессию. Используем массив Array и внутри добавляем. О том как хранить данные в массиве, поговорим позже. Внутри массива, происходит такая аналогия: Login => Введёный_Логин а Password => Зашифрованный_Пароль. Вместе с этим мы перемещаем нашего авторизованного пользователя на главную страницу используя header и прекращаем выполнение кода функцией exit;
Готово
Регистрация
Регистрационные данные пользователей мы будем записывать в таблицу users.
Если у Вас ещё нет такой таблицы, то создайте её. В ней должны быть поля id,
login и pas. Другие поля мы не будем использовать.
Если они есть в таблице, то они будут оставаться пустыми.
Форма авторизации отправляет данные в файл registration.php. Расположим его в той же папке, где находится
страница. Код скрипта будет такой:
registration.php:
+
12 |
<?php header('Content-type: text/html; charset=utf-8'); |
345678910 |
$login=$_POST; $pas=$_POST; $db=mysqli_connect('localhost', 'root', '', 'mybase'); $query="INSERT INTO users (login, pas) VALUES ('$login', '$pas')"; $result=mysqli_query($db, $query); if ($result) header("Location: formreg.php"); mysqli_close($db); |
В строке 9 мы устанавливаем возврат к странице с формами. Так как на локальном сервере выполнение скрипта и
повторная загрузка страницы происходит очень быстро, то визуально это будет выглядеть так, как будто при нажатии
кнопки «Зарегистрироваться», ничего не происходит. На реальных сайтах обычно делают переход на
специальную страницу с информацией о том, что пользователь зарегистрирован и регисрационными
данными. Попробуйте выполнить регистрацию и посмотрите, появляются ли в базе данных новые записи.
3) Generate Query to Compare User Input with the Database.
In the following PHP code, it checks the $_POST global array length before executing the authentication code block. Once the user authentication form is submitted, then this global array will contain the values of the form input fields.
The PHP authentication code includes DataSource class at the beginning of the program. It connects the MySQL database by specifying the configurations to get the connection object. It uses MySQLi with prepared statements to execute authentication queries.
After receiving user authentication details in PHP, it compares the form data with the user database by executing a query by using the connection object.
The query binds the username entered by the user via HTML form. Then, it verifies the password hash with the entered password to return the authentication results.
If a match is found, it means the user is genuine who registered already with the system. So, the authentication code will allow the user to proceed further.
No matter whether the authentication is cleared or not. Anyhow this code will acknowledge the user by displaying success or warning based on the result of the authentication process.
Database query preparation and parameter binding
To perform database operations this code uses secured prepared-statements to execute queries.
It creates a connection object by specifying the database credentials. This connection is used to validate login details with the MySQL database.
Безопасный метод авторизации на PHP
Давайте посмотрим вокруг: форумы, интернет магазины, гостевые книги и т.д. используют регистрацию и последующую авторизацию пользователей. Можно даже сказать, что это почти необходимая функция каждого сайта (только если это не домашняя страничка Васи Пупкина или не визитная карточка, какой-нибудь небольшой компании). Сегодня я хочу поделиться со всеми новичками информацией, о том, как лучше это все реализовать.
Регистрация:
логин (a-z0-9)
пароль
Cookie:
уникальный идентификатор юзера
хэш
Сервер MySQL
Таблица users user_id (int(11)) user_login (Varchar(30)) user_password (varchar(32)) user_hash (varchar(32)) user_ip (int(10)) по умолчанию 0
При регистрации в базу данных записывается логин пользователя и пароль(в двойном md5 шифровании)
При авторизация, сравниваеться логин и пароль, если они верны, то генерируеться случайная строка, которая хешируеться и добавляеться в БД в строку user_hash. Также записываеться IP адрес пользователя(но это у нас будет опциональным, так как кто-то сидит через Proxy, а у кого-то IP динамический… тут уже пользователь сам будет выбирать безопасность или удобство). В куки пользователя мы записываем его уникальный индетификатор и сгенерированный hash.
Почему надо хранить в куках хеш случайно сгенерированной строки, а не хеш пароля? 1. Из-за невнимательности программиста, во всей системе могут быть дырки, воспользовавшийсь этими дырками, злоумышленик может вытащить хеш пароля из БД и подставить его в свои куки, тем самым получить доступ к закрытым данным. В нашем же случае, двойной хеш пароля не чем не сможет помочь хакеру, так как расшифровать он его не сможет(теоретически это возможно, но на это он потратит не один месяц, а может быть и год) а воспользоваться этим хешем ему негде, ведь у нас при авторизации свой уникальный хеш прикрепленный к IP пользователя.
Установка и настройка phpMyAdmin
Для тех, кто предпочитает графическую оболочку для работы с базами данных, можно установить phpMyAdmin.
ВАЖНО:
необходимо иметь в виду некоторые вопросы безопасности при использовании phpMyAdmin, поскольку он:
- Напрямую взаимодействует с MySQL.
- Выполняет аутентификацию использую логин и пароль MySQL.
- Выполняет и возвращает результаты произвольных запросов SQL.
По этим причинам, а также потому, что phpMyAdmin является одним из наиболее распространённых и атакуемых PHP приложений, вам не стоит запускать phpMyAdmin на удалённых машинах с простым соединением HTTP. Если у вас ещё нет домена с настроенным SSL/TLS сертификатом, рекомендуем ознакомиться со статьёй Делаем Apache безопаснее с помощью Let’ Encrypt на Ubuntu 16.04.
Учли все вышесказанное? — тогда вперед!
Устанавливаем phpmyadmin как обычно:
В процессе установки будут заданы несколько вопросов — ЧИТАЕМ их и отвечаем (Apache, Yes, пароль пользователя root MySQL-сервера, новый пароль посложнее для доступа в phpMyAdmin).
Установка phpMyAdmin завершена. Чтобы протестировать этот инструмент в работе, необходимо добавить phpMyAdmin к конфигурации Apache.
Добавляем phpMyAdmin к конфигурации Apache
Для этого открываем конфигурационный файл Apache:
Перемещаемся в его конец и добавляем строчку для подключения phpMyAdmin:
Сохраняем изменения и перезагружаем Apache (service apache2 restart)
Защищаем phpMyAdmin
Проще всего это сделать с помощью установки дополнительной аутентификации на уровне web-сервера. При обращении к директории, в которой установлен phpMyAdmin, web-сервер будет запрашивать связку логин/пароль. Неправильный ввод данных на этом уровне не позволит злоумышленнику получить доступ к странице ввода учетных данных phpMyAdmin. Пробить такую защиту тоже можно, но сделать это будет намного сложней.
-
Настроим авторизацию на уровне Apache
Сначала откроем конфигурационный файл phpMyAdmin, который используется с Apache:Находим в файле блок «» и дописываем директиву «AllowOverride All». Отредактированный блок в итоге должен выглядеть так:
При помощи директивы “AllowOverride” мы сообщили Apache, что все директивы могут быть переопределены через внешний файл настроек – «.htaccess»
- Подготавливаем .htaccessСоздадим новый конфигурационный файл .htaccess в директории с phpmyadmin:
Прописываем в этом файле необходимость авторизации на уровне web-сервера:
В конфигурационном файле использовались следующие директивы:
- AuthType – директива определяет тип идентификации пользователя.
- AuthName – директива используется совместно с предыдущей. В ней пишем текст, который будет отображаться в диалоге запроса логина/пароля. Значением директивы может быть абсолютно любой текст.
- AuthUserFile – значением директивы выступает путь к файлу, содержащий информацию о пользователях и их паролях, которые могут получить доступ к закрытому ресурсу. На данном этапе этого файла нет, мы создадим его чуть позже.
- Require – директива позволяет определить принцип аутентификации. Она может принимать несколько значений (например, мы можем перечислить пользователей или группы пользователей, которые могут получать доступ к закрытому ресурсу). Значение Valid-user подразумевает, что получить доступ к закрытому ресурсу могут получить все пользователи, доступные в файле AuthUserFile.
- Создание .htpasswd файлаНеобходимые настройки сделаны. Теперь создадим файл, путь к которому мы указывали в директиве AuthUserFile. Для этого вводим команду:
Имя пользователя выбираем любое, с системными пользователями оно не переплетается. Утилита htpasswd запросит пароль для нового пользователя. Придумываем пароль и после завершения создания пользователя перезапускаем apache:
Проверяем авторизацию на уровне web-сервера
Попробуем обратиться к phpMyAdmin. Если все описанные выше манипуляции были проделаны правильно, то страница входа phpMyAdmin сразу будет недоступна. Вместо нее появится окно с запросом имени пользователя и пароля. Вводим данные, которые мы указали утилите htpasswd и только после этого попадаем на страницу входа в phpMyAdmin.
Создание авторизации на PHP
Сейчас мы создадим пример авторизации. Основную функцию будет выполнять класс AuthClass.
Вот код с пояснением:
<?php session_start(); //Запускаем сессии /** * Класс для авторизации * @author дизайн студия ox2.ru */ class AuthClass { private $_login = "demo"; //Устанавливаем логин private $_password = "www.ox2.ru"; //Устанавливаем пароль /** * Проверяет, авторизован пользователь или нет * Возвращает true если авторизован, иначе false * @return boolean */ public function isAuth() { if (isset($_SESSION)) { //Если сессия существует return $_SESSION; //Возвращаем значение переменной сессии is_auth (хранит true если авторизован, false если не авторизован) } else return false; //Пользователь не авторизован, т.к. переменная is_auth не создана } /** * Авторизация пользователя * @param string $login * @param string $passwors */ public function auth($login, $passwors) { if ($login == $this->_login && $passwors == $this->_password) { //Если логин и пароль введены правильно $_SESSION = true; //Делаем пользователя авторизованным $_SESSION = $login; //Записываем в сессию логин пользователя return true; } else { //Логин и пароль не подошел $_SESSION = false; return false; } } /** * Метод возвращает логин авторизованного пользователя */ public function getLogin() { if ($this->isAuth()) { //Если пользователь авторизован return $_SESSION; //Возвращаем логин, который записан в сессию } } public function out() { $_SESSION = array(); //Очищаем сессию session_destroy(); //Уничтожаем } } $auth = new AuthClass(); if (isset($_POST) && isset($_POST)) { //Если логин и пароль были отправлены if (!$auth->auth($_POST, $_POST)) { //Если логин и пароль введен не правильно echo "<h2 style="color:red;">Логин и пароль введен не правильно!</h2>"; } } if (isset($_GET)) { //Если нажата кнопка выхода if ($_GET == 1) { $auth->out(); //Выходим header("Location: ?is_exit=0"); //Редирект после выхода } } ?>
<?php if ($auth->isAuth()) { // Если пользователь авторизован, приветствуем: echo "Здравствуйте, " . $auth->getLogin() ; echo "<br/><br/><a href='?is_exit=1'>Выйти</a>"; //Показываем кнопку выхода } else { //Если не авторизован, показываем форму ввода логина и пароля ?>
<form method="post" action=""> Логин: <input type="text" name="login" value="<?php echo (isset($_POST)) ? $_POST : null; // Заполняем поле по умолчанию ?>" /> <br/> Пароль: <input type="password" name="password" value="" /><br/> <input type="submit" value="Войти" /> </form>
<?php }
Конечно это самый простой пример создание авторизации на php. Пароли и имена пользователей должны браться из базы данных, шифроваться в MD5, и т.д. Более сложные примеры создания авторизации будут в следующих статьях.
Открытие сессии
session_start — это та функция, которую мы должны выполнить, перед тем, как работать
с сессиями. Данная функция запускает или открывает сессию и по сути, поскольку нам
необходимо хранить данные, которые будут доступны между страницами, то сессия —
это ничто иное как файл, который хранится во временной папке (эта папка будет
хранится в папке: userdata/temp для Open Server) В этот текстовый файл
записываются все те данные, которые мы сохраняем в сессию. И когда мы запускаем
на выполнение функцию session_start, то она создает такой файл либо обращается к
нему, если файл уже был создан ранее. Причем этот файл индивидуален для каждой
открытой сессии. Это значит, что если мы обратимся к одному и тому же скрипту
из двух различных браузеров, то под каждый браузер, под каждого клиента
будет открыт свой файл сессии и эти файлы никак друг с другом не пересекаются.
Из этого следует, что с помощью сессий, мы можем организовать механизм аторизации
пользователя, то есть получения доступа к какой-то закрытой части сайта.
Для того, чтобы понять, что данный файл принадлежит конкретному клиенту — делается
это посредством куки .
Куки — это тот же самый файл, который хранится не на сервере, а на стороне клиента
(в браузере), в нем содержится индификатор , который совпадает с идификатором файла ,
который лежит на сервере.
Что такое сессия в PHP?
Известно, что веб-сервер не поддерживает постоянного соединения с посетителем, и каждый запрос обрабатывается, как новый, без связи с предыдущими. А это означает, что сервер не может запоминать конкретного посетителя между несколькими запросами, т.е. при доступе к веб-странице сервер отвечает за предоставление содержимого только конкретной запрашиваемой страницы.
Часто возникает необходимость отображать информацию определенного пользователя на всех страницах и, при этом, вам нужно аутентифицировать пользователя в каждом запросе. Представьте, что вам нужно было бы вводить логин и пароль пользователя на каждой странице, где была представлена ваша информация о профиле. Это было бы вообще не практично, и именно в таких случаях необходимы сессии.
Переменные сессии решают эту проблему, сохраняя информацию о пользователе, которая будет использоваться на нескольких веб-страницах (например, логин посетителя, любимая музыка и др.). По умолчанию переменные сессии действуют до тех пор, пока пользователь не закроет браузер.
Одним из недостатков файлов является то, что они хранятся на компьютере пользователя. Это дает пользователю возможность получать доступ, просматривать и изменять этот файл cookie, что может привести к сбою приложения. PHP, наоборот, хранят в системе пользователя только идентификационный файл cookie, который используется для ссылки на файл сессии на сервере. Таким образом, пользователь не имеет доступа к содержимому файла сессии, тем самым обеспечивая безопасную альтернативу файлам cookie. Сессии PHP также работают, когда пользователь отключает поддержку файлов cookie браузером.
Сеанс создает файл во временном каталоге на сервере, где хранятся зарегистрированные переменные сеанса и их значения. Эти данные будут доступны для всех страниц сайта во время этого посещения.
Сессия создает файл во временном каталоге на сервере, где хранятся зарегистрированные переменные сессии и их значения. Эти данные будут доступны для всех страниц сайта во время этого посещения пользователем.
Расположение временного файла определяется настройкой в файле php.ini в директиве .
Пример использования в файле php.ini:
session.save_path = «/var/www/my_site/data/tmp»
Изменить директорию для хранения файлов сессий можно добавив в файл .htaccess:
php_value session.save_path «/var/www/my_site/data/tmp»
Перед использованием любой переменной сеанса убедитесь, что вы установили этот путь.
Когда сессия стартует, происходит следующее:
-
Сначала PHP создает уникальный идентификатор для этой конкретной сессии, который представляет собой случайную строку из 32 шестнадцатеричных чисел, например 5c9foj24c3jj973hjkop2fc937e3463.
-
Файл cookie под названием автоматически отправляется на компьютер пользователя для хранения уникальной строки идентификации сессии.
-
Файл автоматически создается на сервере в назначенном временном каталоге и имеет имя уникального идентификатора с префиксом sess_, т.е. sess_5c9foj24c3jj973hjkop2fc937e3463.
Когда сценарию PHP нужно получить значение из переменной сессии, PHP автоматически получает строку уникального идентификатора сессии из файла cookie , а затем ищет в своем временном каталоге файл c этим именем и проверка может быть выполнена путем сравнения обоих значений.
С помощью специальных функций мы можем получить данный идентификатор:
echo session_id(); // идентификатор сессии
echo session_name(); // имя — PHPSESSID
То же значение мы могли бы получить, обратившись к cookie напрямую:
echo $_COOKIE;
Сессия заканчивается, когда пользователь закрывает браузер или покидает сайт, сервер завершает сеанс через заранее определенный период времени, обычно продолжительностью 30 минут.
Как разлогинить пользователя, сделать выход
Ну это уж совсем просто. Если мы определяем авторизован ли пользователь по наличию userid в сессии, то чтобы его разлогинить нужно удалить его оттуда. Делается так:
Unset($_SESSION);
Еще можно убить сессию для верности. Это очистит куку у пользователя и уничтожит файл сессии на сервере. При этом из нее пропадут все данные. Делается так:
Session_destroy();
На этом все. Если остались какие-то вопросы — не стесняйтесь обращаться. Более того, вы можете обратиться ко мне по icq или почте и попросить помочь с чем-нибудь. Я обычно не отказываю. Если помощь потребуется серьезная — я могу попросить небольшую оплату. Кроме того, я могу дистанционно учить вас делать сайты! Вот такой я коуч и гуру:) А если вы хотите получать уроки и трюки просто так, бесплатно — подпишитесь на RSS моего блога .
Спонсор этого поста — ibooknet.ru, который предлагает ремонт ноутбуков по приятным ценам. Лично мой ноут в порядке и надеюсь, мне не придется его чинить. Чего и вам желаю.
Все кто разрабатывает web сайты, рано или поздно сталкивается с такой задачей как авторизация и аутентификация пользователей
, реализованная именно с помощью языка программирования, а не с помощью стандарта протокола http. Сегодня мы рассмотрим пример создания простой авторизации с использованием языка программирования PHP, а данные о пользователях будем хранить в базе MySQL.
Приведенный ниже способ является простым или как бы основой для создания нормальной авторизации, но его Вы вполне можете использовать, так как он достаточно хорошо работает, также Вы сами можете улучшить этот способ и внедрить у себя на сайте.
Данный способ основан на сессиях, но я здесь применяю и куки, для того чтобы браузер запоминал пользователя, который аутентифицировался прошлый раз, чтобы каждый раз не вводить логин, можно конечно хранить в куках и пароль, но это не безопасно, даже если он зашифрован. Для того чтобы сессия закончилась, просто закройте браузер и откройте заново.