Ajax авторизация и регистрация на PHP

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 за найденные баги.