Ajax авторизация и регистрация на PHP
Напишем систему авторизации и регистрации пользователей на PHP. Для работы скриптов потребуется интерпретатор PHP версии 5.3 и сервер MySQL 5.
Создание базы данных
Создадим новую базу данных с названием testdb , выполнив следующий запрос от привилегированного пользователя.
Для работы с базой, добавим отдельного пользователя testdb и предоставим ему необходимые права.
Структура таблицы usersДля хранения пользователей создадим в базе данных таблицу users , выполнив следующий запрос.
- id — уникальный идентификатор пользователя
- username — логин
- password — шифрованный пароль
- salt — соль для шифрования пароля
Структура файлов и директорий
Создадим директорию «php-auth» для нашего проекта. Добавим в нее следующие файлы и папки:
- login.php — страница авторизации пользователя
- register.php — страница регистрации
- ajax.php — Файл для обработки Ajax-запросов
- js — клиентские скрипты
- ajax-form.js — скрипт для работы с Ajax-формами
- style.css — основной файл стилей
- reset.css — файл сброса кастомных стилей браузеров
- bootstrap — Twitter Bootstrap 2.3.2
- AjaxRequest.class.php — обертка для работы с Ajax-запросами
- Auth.class.php — класс для работы с пользователями
Регистрация пользователей
При регистрации, пользователю нужно ввести логин, пароль и подтверждения пароля. После отправки формы будем делать проверку на существование введенного логина. Если логин уже существует — уведомляем об этом посетителя.
Вся работа с базой данных будет происходить через расширение PDO для PHP. Оно включено в стандартную библиотеку PHP, начиная с версии 5.1.
Основная логика приложения находится в файле classes/Auth.class.php . Разберем подробнее его содержимое.
Алгоритм регистрации
Для создания нового пользователя используется метод User::create() , который принимает логин и пароль в качестве аргументов.
Первым делом, проверяем существование пользователя. Для этого используем метод User::getSalt() , который выбирает из базы «соль» пользователя по его логину. Соль нужна для усложнения подбора паролей пользователей в случае утечки базы.
Если пользователь существует — выбрасываем исключение. Иначе, генерируем новую соль и хешируем ей пароль. После этого выполняем запрос на добавление данных в базу. Если при выполнении запроса происходит ошибка, печатаем соответствуюее сообщение и завершаем работу скрипта. Такая ситуация может произойти при отключении сервера MySQL или его внутренней ошибки.
Если пользователь был усшешно создан, функция User::create() возвращает его уникальный идентификатор. Это обычное числовое поле, которое автоматически увеличивается при добавлении записей в таблицу.
Алгоритм аутентификации
Для того, чтобы проверить правильность ввода логина и пароля, используется метод User::authorize() . Первым делом, мы проверяем существование юзера, пытаясь выбрать его соль из базы. Если пользователь не найден, сразу возвращаем false . Иначе, хешируем принятый пароль этой солью через функцию User::passwordHash() . Затем, делаем выборку из базы по логину и хешу пароля.
Если результат запроса оказался непустым, то логин и пароль верные. Сохраняем пользотельские данные в объекте класса User . Записываем id пользователя в сессию через метод User::saveSession() . Если в качестве первого аргумента — $remember , передать ей true , то идентификатор сессии сохранится в куках. Это позволит не вводить пароль каждый раз при перезапуске браузера.
Работа с формами через Ajax
Для обработки Ajax-запросов создадим класс AjaxRequest. Сохраним его в файле classes/AjaxRequest.class.php .
Этот класс облегчит нам обработку данных, отправленных пользователем из формы. В качестве конструктора, он принимает массив с данными запроса ( $_GET или $_POST ).
В запросе обязательно должно быть поле act , которое определяет текущее действие. Например, при регистрации значением $_POST["act"] будет «register», а при авторизации — «login».
Метод getRequestParam() нужен для получения параметра из запроса. Он делает дополнительную проверку на существование ключа массива и возвращает null , если запрос не содержит нужных данных.
Функция setResponse() используется для формирования ответа. Метод setFieldError() нужен для передачи сообщения об ошибке в поле формы.
Для того, чтобы вернуть ответ пользователю, мы используем метод showResponse . Он генерирует строку в JSON-формате, задает нужные HTTP-заголовки и возвращает данные клиенту.
В файле ajax.php происходит непосредственная обработка запросов через класс AjaxRequest .
Формат JSON-ответаНа клиентской стороне, мы должны иметь возможность показать результат операции в понятном для человека виде. Для этого мы возвращаем JSON ответ в таком формате:
Создадим файл js/ajax-form.js . Он будет перехватывать событие отправки всех форм с классом ajax и отправлять асинхронный запрос серверу. Исходный код ajax-form.js.
Для работы скрипта нужен jQuery версии 2.0.3 (лежит в архиве с исходниками).
Обработка ответов происходит в методах объекта script.ajaxForm.callbacks . Пример обработчика ответа для авторизации на сайте:
Эти коллбеки вызываются только, если валидация ответа прошла успешно. Метод script.ajaxForm.validate проверяет наличие в ответе имени поля с ошибкой. Если такое поле существует, подствечивает его и отображает текст самой ошибки.
Если нашли ошибку в коде или тексте статьи — обязательно напишите о ней в комментариях.
UPDATE: Исправлены ошибки, связанные с хешированием пароля, нормально заработала функция «Запомнить меня». Спасибо пользователю santas156 за найденные баги.