Урок 32: Авторизация и аутентификация через PHP

На 32-ом уроке мы переходим к одному  интересных уроков в нашем курсе по PHP. Мы будем говорить о авторизации и аутентификации, точнее о ключевых элементах безопасности любого веб-приложения. Если вы хотите создать сайт, где пользователи могут регистрироваться, входить и управлять своими данными, то этот урок для вас.

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

Что такое аутентификация и авторизация?

Прежде чем мы начнем писать код, давайте разберемся с терминами:

  • Аутентификация это процесс проверки, что пользователь действительно тот, за кого себя выдает. Например, когда вы вводите логин и пароль, система проверяет, совпадают ли они с данными в базе.
  • Авторизация это процесс проверки прав доступа. Например, после входа в систему администратор может редактировать контент, а обычный пользователь — только просматривать.

Теперь, когда мы понимаем разницу, перейдем к практике.

Создание системы входа пользователя

Шаг 1: Подготовка базы данных

Для начала нам нужно создать таблицу пользователей в базе данных. Вот пример SQL-запроса:

sql
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Здесь:

  • id — уникальный идентификатор пользователя.
  • username — имя пользователя (логин).
  • password — хэшированный пароль.
  • created_at — дата регистрации.

Шаг 2: Регистрация пользователя

Перед тем как пользователь сможет войти, он должен зарегистрироваться. Вот пример формы регистрации:

html
<form action="register.php" method="POST">
    <label for="username">Имя пользователя:</label>
    <input type="text" id="username" name="username" required>
    
    <label for="password">Пароль:</label>
    <input type="password" id="password" name="password" required>
    
    <button type="submit">Зарегистрироваться</button>
</form>

Теперь создадим файл register.php, который будет обрабатывать данные формы:

php
<?php
// Подключение к базе данных
$pdo = new PDO('mysql:host=localhost;dbname=your_database', 'username', 'password');

// Получаем данные из формы
$username = $_POST['username'];
$password = $_POST['password'];

// Хэшируем пароль
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);

// Сохраняем пользователя в базе данных
$stmt = $pdo->prepare("INSERT INTO users (username, password) VALUES (:username, :password)");
$stmt->execute(['username' => $username, 'password' => $hashedPassword]);

echo "Регистрация прошла успешно!";
?>

Обратите внимание на функцию password_hash(). Она хэширует пароль, делая его безопасным для хранения в базе данных.

Хранение паролей в безопасном виде

Хранение паролей в открытом виде это огромная ошибка, которая может привести к утечке данных. В PHP для безопасного хранения паролей используется функция password_hash(), а для проверки — password_verify().

Как работает password_hash()?

Эта функция принимает два аргумента:

  1. Пароль в открытом виде.
  2. Алгоритм хэширования (рекомендуется использовать PASSWORD_DEFAULT).

Пример:

php
$password = "my_secure_password";
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);

Теперь $hashedPassword можно безопасно хранить в базе данных.

Как работает password_verify()?

Эта функция проверяет, совпадает ли введенный пароль с хэшированным паролем в базе данных. Пример:

php
$password = "my_secure_password";
$hashedPassword = "хэш_из_базы_данных";

if (password_verify($password, $hashedPassword)) {
    echo "Пароль верный!";
} else {
    echo "Неверный пароль.";
}

Создание системы входа

Теперь, когда у нас есть зарегистрированные пользователи, давайте создадим систему входа.

Шаг 1: Форма входа

Создадим HTML-форму для входа:

html
<form action="login.php" method="POST">
    <label for="username">Имя пользователя:</label>
    <input type="text" id="username" name="username" required>
    
    <label for="password">Пароль:</label>
    <input type="password" id="password" name="password" required>
    
    <button type="submit">Войти</button>
</form>

Шаг 2: Обработка входа

Теперь создадим файл login.php, который будет проверять данные пользователя:

php
<?php
session_start();

// Подключение к базе данных
$pdo = new PDO('mysql:host=localhost;dbname=your_database', 'username', 'password');

// Получаем данные из формы
$username = $_POST['username'];
$password = $_POST['password'];

// Ищем пользователя в базе данных
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->execute(['username' => $username]);
$user = $stmt->fetch();

// Проверяем пароль
if ($user && password_verify($password, $user['password'])) {
    // Сохраняем пользователя в сессии
    $_SESSION['user_id'] = $user['id'];
    $_SESSION['username'] = $user['username'];
    
    echo "Добро пожаловать, " . $user['username'] . "!";
} else {
    echo "Неверное имя пользователя или пароль.";
}
?>

Шаг 3: Защита страниц

Теперь, когда пользователь вошел, мы можем защитить страницы, доступные только для авторизованных пользователей. Например:

php
<?php
session_start();

if (!isset($_SESSION['user_id'])) {
    header("Location: login.php");
    exit;
}

echo "Привет, " . $_SESSION['username'] . "! Это защищенная страница.";
?>

Практические задачи

  1. Регистрация и вход. Создайте полную систему регистрации и входа пользователя. Добавьте проверку на уникальность имени пользователя.
  2. Восстановление пароля. Реализуйте функционал восстановления пароля через email.
  3. Роли пользователей. Добавьте роли (например, «администратор» и «пользователь») и реализуйте разграничение прав доступа.

Пример кода: восстановление пароля

php
<?php
// Отправка письма с ссылкой для сброса пароля
$email = $_POST['email'];
$token = bin2hex(random_bytes(50));

$stmt = $pdo->prepare("UPDATE users SET reset_token = :token WHERE email = :email");
$stmt->execute(['token' => $token, 'email' => $email]);

$resetLink = "https://yourwebsite.com/reset_password.php?token=" . $token;
mail($email, "Сброс пароля", "Перейдите по ссылке для сброса пароля: " . $resetLink);
?>

Сегодня мы разобрали, как создать систему авторизации и аутентификации на PHP. Вы узнали, как безопасно хранить пароли, как проверять данные пользователя и как защищать страницы от несанкционированного доступа. Эти знания являются основой для создания безопасных веб-приложений.

Если вы хотите углубить свои знания, рекомендую изучить дополнительные темы, такие как OAuth, JWT и двухфакторная аутентификация.

Попробуйте выполнить все задачи из этого урока, чтобы закрепить материал.

Хотите изучить PHP от А до Я? Переходите к полному курсу: PHP для начинающих.