OAuth 2.0 и JWT авторизация на PHP: полное руководство для начинающих

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение: зачем нужны OAuth 2.0 и JWT в современных веб-приложениях?

В современной веб-разработке безопасная передача данных между клиентом и сервером — одна из ключевых задач. Традиционные методы аутентификации, такие как сессии на основе cookies, хорошо работают для монолитных приложений, но становятся неудобными при создании REST API, мобильных приложений или микросервисной архитектуры. Именно здесь на помощь приходят два мощных инструмента: протокол OAuth 2.0 и формат токенов JWT (JSON Web Token).

В этой статье мы разберем базовые концепции OAuth 2.0 и JWT, а затем шаг за шагом создадим простую систему авторизации на PHP. Статья ориентирована на начинающих разработчиков, поэтому все объяснения будут максимально простыми и сопровождаться практическими примерами кода.

Что такое OAuth 2.0 и как он работает?

OAuth 2.0 — это протокол авторизации, который позволяет приложениям получать ограниченный доступ к ресурсам пользователя без передачи его логина и пароля. Представьте, что вы хотите войти на сайт через аккаунт Google или Facebook — это и есть работа OAuth 2.0.

Основные роли в OAuth 2.0

  • Resource Owner (Владелец ресурса) — пользователь, который владеет данными.
  • Client (Клиент) — приложение, которое хочет получить доступ к данным пользователя.
  • Authorization Server (Сервер авторизации) — сервер, который выдает токены после успешной аутентификации.
  • Resource Server (Сервер ресурсов) — сервер, который хранит защищенные данные и проверяет токены.

Поток авторизации (Authorization Code Grant)

Самый распространенный и безопасный поток OAuth 2.0 выглядит так:

  1. Клиент перенаправляет пользователя на сервер авторизации.
  2. Пользователь входит в систему и дает разрешение.
  3. Сервер авторизации возвращает клиенту authorization code.
  4. Клиент обменивает код на access token (токен доступа).
  5. С помощью access token клиент обращается к серверу ресурсов.

Что такое JWT и почему он так популярен?

JWT (JSON Web Token) — это компактный и самодостаточный формат токена, который используется для передачи информации между сторонами в виде JSON-объекта. Информация в JWT может быть проверена и доверена, так как токен подписан цифровой подписью.

Структура JWT

JWT состоит из трех частей, разделенных точками:

header.payload.signature
  • Header (Заголовок) — содержит тип токена (JWT) и алгоритм подписи (например, HS256 или RS256).
  • Payload (Полезная нагрузка) — содержит данные (claims), такие как идентификатор пользователя, роль, время создания и истечения токена.
  • Signature (Подпись) — создается путем шифрования заголовка и полезной нагрузки с использованием секретного ключа.

Преимущества JWT

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

Практическая реализация: создаем систему авторизации на PHP

Теперь перейдем к самому интересному — написанию кода. Мы создадим простой скрипт на PHP, который генерирует JWT-токен и проверяет его при каждом запросе. Для работы с JWT мы будем использовать библиотеку firebase/php-jwt.

Шаг 1: Установка библиотеки через Composer

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

composer require firebase/php-jwt

Шаг 2: Генерация JWT токена

Создадим файл generate_token.php, который будет принимать логин и пароль пользователя и возвращать JWT-токен.

<?php
require_once 'vendor/autoload.php';

use Firebase\JWT\JWT;
use Firebase\JWT\Key;

// Секретный ключ (должен храниться в .env файле!)
$secretKey = 'your-secret-key-here';

// Пример проверки пользователя (в реальном проекте — запрос к БД)
$users = [
    'admin' => 'password123',
    'user'  => 'qwerty'
];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $login = $_POST['login'] ?? '';
    $password = $_POST['password'] ?? '';

    if (isset($users[$login]) && $users[$login] === $password) {
        // Данные для токена (payload)
        $payload = [
            'iss' => 'pythonlib.ru',           // Издатель токена
            'iat' => time(),                    // Время создания
            'exp' => time() + 3600,             // Срок действия (1 час)
            'data' => [
                'id' => 1,
                'login' => $login,
                'role' => 'user'
            ]
        ];

        // Генерация JWT
        $jwt = JWT::encode($payload, $secretKey, 'HS256');

        // Возвращаем токен клиенту
        echo json_encode([
            'status' => 'success',
            'token' => $jwt
        ]);
        exit;
    } else {
        http_response_code(401);
        echo json_encode(['status' => 'error', 'message' => 'Неверный логин или пароль']);
        exit;
    }
}
?>

Шаг 3: Проверка JWT токена при запросе

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

<?php
require_once 'vendor/autoload.php';

use Firebase\JWT\JWT;
use Firebase\JWT\Key;

$secretKey = 'your-secret-key-here';

// Получаем заголовок Authorization                

Блоги

Рекомендаций по книгам