BMC IO DocsBMC IO Docs
IO v6
IO v7
Notes
Docs
IO v6
IO v7
Notes
Docs
  • IO Framework v7

    • О фреймворке
    • Что изменилось в 7 версии
    • IO7 Framework vs Laravel 13 — Сравнение
    • Структура
    • Варианты проектов
    • Доступ к участкам проекта
    • Разворачивание нового проекта
    • Установка проекта
    • Запуск локальной разработки
  • API

    • Обзор API
    • IOCore::call() и IOCore::callAction()
    • Создание API
  • CLI

    • Обзор CLI
    • iocli
    • Кастомные CLI команды
  • Работа с базами данных

    • Обзор работы с базами данных
    • Cron / Планировщик задач (Schedule)
    • Фабрики
    • Миграции
    • Сидеры
    • Query Builder
    • Подключение MinIO
    • Подключение MongoDB
    • Подключение MySQL
    • Подключение PostgreSQL
    • Подключение ProxySQL
    • Подключение RabbitMQ
    • Подключение Redis
  • Логирование

    • Обзор логирования
    • IOEvent - Логирование событий
    • Pinba (PinbaManager) - Профилировщик
  • Модели

    • Обзор моделей
    • CRUD операции
    • Связи моделей
  • Очереди

    • Обзор очередей
    • RabbitMQ
  • Маршруты

    • Обзор маршрутов
    • Определение маршрутов
    • Middleware
  • Сессии

    • Обзор сессий
    • Кроссдоменная SSO
    • JWT авторизация
    • Социальная авторизация
    • OAuth2
    • Keycloak
  • Twig

    • Обзор Twig
    • Формы (FormBuilder)
    • Twig функции
  • Тестирование

    • Обзор тестирования
    • Unit тесты
  • Backend

    • Настройки проекта Conf.php
    • Настройки модуля Module.php
    • Настройки composer
    • Функции фреймворка
    • Вспомогательные функции (Helpers)
    • Глобальные переменные
    • Константы фреймворка
    • Event класс
    • Core класс
    • Route и работа с ними
    • Request и работа с ними
    • Middleware и работа с ними
    • Class и работа с ними
    • Api model и работа с ними
    • Template и работа с ними
    • Мультиязычность и словарь фраз
    • Bin скрипты и работа с ними
    • Cron скрипты и работа с ними
    • $ioSession и работа с сессией
    • $ioHash и работа с кешем
    • $ioXCache и работа с кешем
    • $iodb и работа с базой данных
    • Миграции
  • Frontend

    • Twig шаблонизатор и работа с ним
    • Twig функции
    • Twig фильтры
    • Twig контекст
    • Настройка NPM
    • Сборка Frontend составляющей
    • Обращение к Api через JS
    • Хранилище (store)
    • Навигация в хосте
    • Навигация в микрофронтенде
    • Параметры микрофронтенда
    • Проверка полномочий
  • Tailux UI Компоненты

    • Базовый UI

      • AvatarDot
      • Avatar
      • Badge
      • Button
      • Card
      • ConfirmModal
      • Divider
      • Highlight
      • Tag
    • Загрузка

      • Circlebar
      • Progress
      • Skeleton
      • Spinner
    • Навигация

      • Accordion
      • AccordionButton
      • AccordionHeader
      • AccordionItem
      • AccordionPanel
      • AccordionProvider
      • Pagination
      • PaginationControl
      • PaginationItems
      • PaginationDots
      • PaginationFirst
      • PaginationLast
      • PaginationNext
      • PaginationPrevious
    • Отображение данных

      • Box
      • Collapse
      • ContextualHelp
      • ScrollShadow
      • Timeline
      • TimelineItem
    • Элементы таблиц

      • Table
      • CollapsibleSearch
      • ColumnFilter
      • CopyableCell
      • DateFilter
      • FacetedFilter
      • FilterSelector
      • PaginationSection
      • RadioFilter
      • RangeFilter
      • ResponsiveFilter
      • RoleFilter
      • SelectedRowsActions
      • TableColumnVisibility
      • TableSettings
      • TableSortIcon
    • Элементы форм

      • Checkbox
      • Combobox
      • DatePicker
      • Filepond
      • Input
      • Listbox
      • Radio
      • Range
      • Select
      • StyledSwitch
      • Swap
      • SwapOn
      • SwapOff
      • Switch
      • Textarea
      • TextEditor
      • Upload

JWT авторизация — IO7 Framework

Внимание

Данная статья документации написана нейросетью. Возможны некоторые расхождения и неточность информации!

  • Обзор
  • TokenManager
    • Инициализация
    • Методы HS256 (HMAC)
    • Методы RS256 (RSA, совместимость с IO v6)
  • Session
    • Свойства
    • Методы
  • User (пример класса)
    • Авторизация
    • Создание JWT
    • Парсинг JWT
  • Совместимость с IO v6
  • JWT cookies
  • Конфигурация
    • Константы
    • Генерация ключей

Обзор

IO7 использует IO\Auth\TokenManager — единый менеджер токенов, поддерживающий:

  • HS256 (HMAC) — для OAuth2/стандартных JWT
  • RS256 (RSA) — для совместимости с IO v6 (алгоритм JWTToken)

Библиотека: firebase/php-jwt ^6.11


TokenManager

Инициализация

// HMAC (HS256) — для OAuth2
$manager = \IO\Auth\TokenManager::init([
    'secret_key' => 'my_secret_key',
    'access_ttl' => 3600,
    'refresh_ttl' => 2592000,
]);

// RSA (RS256) — совместимость с IO v6
$manager = \IO\Auth\TokenManager::init([
    'public_key' => file_get_contents('public.pem'),
    'private_key' => file_get_contents('private.pem'),
    'access_ttl' => 3600,
]);

Методы HS256 (HMAC)

createAccessToken(string $userId, array $scopes = [], int $ttl = 0): string

Создать access token.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$userIdstring—ДаID пользователя
$scopesarray[]НетОбласти доступа
$ttlint0НетВремя жизни (0 = по умолчанию)
ВозвратstringJWT token
$token = $manager->createAccessToken('user_123', ['read', 'write']);

createRefreshToken(string $userId, int $ttl = 0): string

Создать refresh token.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$userIdstring—ДаID пользователя
$ttlint0НетВремя жизни (0 = 30 дней)
ВозвратstringJWT token
$refreshToken = $manager->createRefreshToken('user_123');

validateAccessToken(string $token): ?array

Валидация access token.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$tokenstring—ДаJWT token
Возвратarray|nullPayload или null
$payload = $manager->validateAccessToken($token);
if ($payload) {
    echo $payload['sub']; // user_id
}

validateRefreshToken(string $token): ?array

Валидация refresh token.

refreshAccessToken(string $refreshToken): ?array

Обновить access token через refresh token.

$newToken = $manager->refreshAccessToken($refreshToken);
// ['access_token' => '...', 'sub' => 'user_123']

Методы RS256 (RSA, совместимость с IO v6)

encode(string $privateKey): string

Кодировать RSA токен (RS256).

ПараметрТипЗначение по умолчаниюОбязателенОписание
$privateKeystring—ДаPEM-ключ RSA приватный
ВозвратstringJWT token
$manager = new TokenManager();
$manager->setUserData([
    'id' => 123,
    'login' => 'john_doe',
    'sname' => 'Doe',
    'fname' => 'John',
    'pol' => 1,
]);
$jwt = $manager->encode(file_get_contents('private.pem'));

decode(string $str, string $publicKey): bool

Декодировать RSA токен.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$strstring—ДаJWT строка
$publicKeystring—ДаPEM-ключ RSA публичный
Возвратbooltrue если успешно
$manager = new TokenManager();
$valid = $manager->decode($jwtString, file_get_contents('public.pem'));
if ($valid) {
    $data = $manager->getUserData();
    echo $data['login'];
}

parseRSA(string $str, string $publicKey): ?self

Распарсить и провалидировать RSA токен.

$manager = TokenManager::parseRSA($jwtString, file_get_contents('public.pem'));
if ($manager) {
    echo $manager->getUserData()['login'];
}

setUserData(array $user_data): void

Установить данные пользователя.

getUserData(): array

Получить данные пользователя.

equal(?self $tokenManager): bool

Сравнить два токена.


Session

Свойства

СвойствоТипЗначение по умолчаниюОбязателенОписание
$jwt_tokenTokenManager|nullnullНетТекущий JWT токен
$session_dataarray|nullnullНетДанные сессии
$current_accountint0НетТекущий аккаунт

Методы

isAuth(): bool

Проверить авторизацию.

if ($session->isAuth()) {
    echo $session->getUserLogin();
}

update_jwt_token(string $jwt_string): void

Обновить JWT токен из строки.

$session->update_jwt_token($jwtString);

getUserLogin(): ?string

Получить логин пользователя.

getUserID(): ?int

Получить ID пользователя.


User (пример класса)

Авторизация

// Логин
$response = \IO\Core::call('com.sso.class.user.login', [
    'login' => $login,
    'password' => $password,
]);

if ($response['error_code'] == EIO_OK) {
    $jwt = $response['jwt_string'];
    $session->update_jwt_token($jwt);
}

Создание JWT

$manager = new \IO\Auth\TokenManager();
$manager->setUserData([
    'id' => $user['pkid'],
    'login' => $user['login'],
    'sname' => $user['sname'],
    'fname' => $user['fname'],
    'lname' => $user['lname'],
    'pol' => $user['pol'],
]);
$jwt = $manager->encode(JWT_PRIVATE_KEY);

Парсинг JWT

$manager = \IO\Auth\TokenManager::parseRSA($jwtString, JWT_PUBLIC_KEY);
if ($manager) {
    $data = $manager->getUserData();
    // $data['id'], $data['login'], $data['avatar']
}

Совместимость с IO v6

Для проектов IO v6 (PHP 5.6) используется Legacy/JWTToken.php:

// В IO v6 проекте
require_once 'modules/io7/php/Legacy/JWTToken.php';

$token = new JWTToken();
$token->setUserData(['id' => 1, 'login' => 'user', ...]);
$jwt = $token->encode(file_get_contents('private.pem'));

Алгоритм RS256 совместим между IO v6 и IO v7.


JWT cookies

JWT cookies устанавливаются с параметрами безопасности по умолчанию:

  • SameSite: Lax
  • Secure: true
  • HttpOnly: true

Это гарантирует, что cookie не отправляется с cross-site запросов, передаётся только по HTTPS, и недоступна через JavaScript.

Функция iosetcookie() также использует SameSite=Lax по умолчанию (ранее — None).

Конфигурация

Константы

КонстантаОписание
JWT_PRIVATE_KEYПуть к RSA приватному ключу или PEM строка
JWT_PUBLIC_KEYПуть к RSA публичному ключу или PEM строка
JWT_COOKIEИмя cookie для JWT токена
JWT_LOGIN_SALSAСоль для хеша логина

Генерация ключей

# Генерация RSA ключей
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -pubout -out public.pem
Prev
Кроссдоменная SSO
Next
Социальная авторизация