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

OAuth2 — IO7 Framework

Внимание

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

  • Обзор
  • IO\Auth\OAuth2Server
    • Инициализация
    • Конфигурация
    • Методы
  • IO\Auth\OAuth2Client
    • Конструктор
    • Методы
  • Пример полного цикла (клиент)
  • Пример сервера

Обзор

IO7 предоставляет реализацию OAuth2 сервера и клиента для построения SSO-систем. Сервер обрабатывает authorization code flow, обмен токенами, обновление и отзыв. Клиент подключается к OAuth2 серверу для авторизации приложений.


IO\Auth\OAuth2Server

OAuth2 сервер для SSO проекта. Обрабатывает authorization code flow, token exchange, token refresh, token revocation. Реализован как singleton.

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

$server = \IO\Auth\OAuth2Server::init([
    'issuer' => 'io7-sso',
    'token_manager' => [
        'secret_key' => 'my-secret-key',
        'access_ttl' => 3600,
        'refresh_ttl' => 2592000,
    ],
    'auth_code_ttl' => 600,
]);

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

ПараметрТипЗначение по умолчаниюОбязателенОписание
issuerstring'io7-sso'НетИздатель токенов
token_managerarray—ДаКонфигурация TokenManager
auth_code_ttlint600НетВремя жизни auth code в секундах (10 мин)

Методы

init(array $config): self

Инициализация OAuth2 сервера.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$configarray—ДаКонфигурация сервера
ВозвратselfЭкземпляр OAuth2Server

getInstance(): self

Получение единственного экземпляра (singleton).

registerClient(string $clientId, string $clientSecret, array $redirectURIs): void

Регистрация OAuth2 клиента.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$clientIdstring—ДаИдентификатор клиента
$clientSecretstring—ДаСекрет клиента
$redirectURIsarray—ДаРазрешённые URI для перенаправления
$server->registerClient(
    'client-abc',
    'client-secret',
    ['https://example.com/callback', 'https://app.example.com/callback']
);

getAuthorizationUrl(string $clientId, string $redirectUri, array $scopes = [], string $state = ''): string

Получение URL для авторизации.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$clientIdstring—ДаИдентификатор клиента
$redirectUristring—ДаURI для перенаправления
$scopesarray[]НетЗапрашиваемые скоупы
$statestring''НетСлучайная строка для CSRF-защиты
ВозвратstringURL для перенаправления
$authUrl = $server->getAuthorizationUrl(
    'client-abc',
    'https://example.com/callback',
    ['read', 'write'],
    'random-state-string'
);
header('Location: ' . $authUrl);

createAuthCode(string $userId, string $clientId, array $scopes, string $redirectUri): string

Создание authorization code.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$userIdstring—ДаИдентификатор пользователя
$clientIdstring—ДаИдентификатор клиента
$scopesarray—ДаСкоупы доступа
$redirectUristring—ДаURI для перенаправления
ВозвратstringAuthorization code
$code = $server->createAuthCode(
    'user-123',
    'client-abc',
    ['read', 'write'],
    'https://example.com/callback'
);

exchangeCode(string $code, string $clientId, string $clientSecret): array

Обмен authorization code на токены.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$codestring—ДаAuthorization code
$clientIdstring—ДаИдентификатор клиента
$clientSecretstring—ДаСекрет клиента
Возвратarray['access_token', 'refresh_token', 'expires_in', 'token_type']
Исключение\InvalidArgumentExceptionЕсли код невалиден или клиент не найден
$tokens = $server->exchangeCode('auth-code-123', 'client-abc', 'client-secret');
$accessToken = $tokens['access_token'];

refreshToken(string $refreshToken, string $clientId, string $clientSecret): array

Обновление токенов с помощью refresh token.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$refreshTokenstring—ДаRefresh token
$clientIdstring—ДаИдентификатор клиента
$clientSecretstring—ДаСекрет клиента
Возвратarray['access_token', 'refresh_token', 'expires_in', 'token_type']
Исключение\InvalidArgumentExceptionЕсли refresh token невалиден
$tokens = $server->refreshToken('refresh-token-123', 'client-abc', 'client-secret');

validateToken(string $token): ?array

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

ПараметрТипЗначение по умолчаниюОбязателенОписание
$tokenstring—ДаAccess token
Возвратarray|nullPayload токена или null
$payload = $server->validateToken($accessToken);
if ($payload !== null) {
    $userId = $payload['sub'];
    $scopes = $payload['scopes'];
}

revokeToken(string $token): bool

Отзыв токена.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$tokenstring—ДаAccess или refresh token
ВозвратboolВсегда true (заглушка)

getIssuer(): string

Получение issuer сервера.

ПараметрТипЗначение по умолчаниюОбязателенОписание
ВозвратstringIssuer

IO\Auth\OAuth2Client

OAuth2 клиент для приложений, которые авторизуются через OAuth2 сервер (SSO).

Конструктор

$client = new \IO\Auth\OAuth2Client(
    'client-id',
    'client-secret',
    'https://sso.example.com/authorize',
    'https://sso.example.com/token',
    'https://sso.example.com/userinfo'
);
ПараметрТипЗначение по умолчаниюОбязателенОписание
$clientIdstring—ДаИдентификатор клиента
$clientSecretstring—ДаСекрет клиента
$authUrlstring—ДаURL авторизации
$tokenUrlstring—ДаURL получения токена
$userInfoUrlstring—НетURL получения информации о пользователе (опционально)

Методы

getAuthorizationUrl(string $redirectUri, array $scopes = []): string

Получить URL для редиректа на авторизацию.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$redirectUristring—ДаURI для回调а
$scopesarray[]НетЗапрашиваемые скоупы
ВозвратstringURL для авторизации
$url = $client->getAuthorizationUrl('https://example.com/callback', ['openid', 'profile']);
header('Location: ' . $url);

exchangeCode(string $code, string $redirectUri): array

Обмен code на токен.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$codestring—ДаAuthorization code
$redirectUristring—ДаURI для callbackа
Возвратarray['access_token', 'refresh_token', 'expires_in']
Исключение\RuntimeExceptionПри ошибке запроса
$token = $client->exchangeCode('auth_code', 'https://example.com/callback');

refreshToken(string $refreshToken): array

Обновление токена.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$refreshTokenstring—ДаRefresh token
ВозвратarrayНовые токены
Исключение\RuntimeExceptionПри ошибке запроса
$newToken = $client->refreshToken('refresh_token_value');

getUserInfo(string $accessToken): ?array

Получить информацию о пользователе.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$accessTokenstring—ДаAccess token
Возвратarray|nullИнформация о пользователе
$userInfo = $client->getUserInfo('access_token_value');

revokeToken(string $token): bool

Отзыв токена.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$tokenstring—ДаТокен для отзыва
ВозвратboolУспешность отзыва
$revoked = $client->revokeToken('token_to_revoke');

getStoredToken(): ?array

Получить сохранённый токен из памяти.

ПараметрТипЗначение по умолчаниюОбязателенОписание
Возвратarray|nullТокен или null

storeToken(array $token): void

Сохранить токен в память.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$tokenarray—ДаТокен для сохранения

clearToken(): void

Очистить токен.

isAuthenticated(): bool

Проверить, авторизован ли пользователь.

ПараметрТипЗначение по умолчаниюОбязателенОписание
Возвратbooltrue если авторизован
if ($client->isAuthenticated()) {
    // Пользователь авторизован
}

Пример полного цикла (клиент)

// 1. Создание клиента
$client = new \IO\Auth\OAuth2Client(
    getenv('OAUTH2_CLIENT_ID'),
    getenv('OAUTH2_CLIENT_SECRET'),
    'https://sso.example.com/authorize',
    'https://sso.example.com/token',
    'https://sso.example.com/userinfo'
);

// 2. Получение URL для авторизации
$url = $client->getAuthorizationUrl(
    'https://myapp.example.com/callback',
    ['openid', 'profile', 'email']
);
header('Location: ' . $url);

// 3. Обработка callback (после редиректа)
$code = $_GET['code'];
$token = $client->exchangeCode($code, 'https://myapp.example.com/callback');
$client->storeToken($token);

// 4. Получение информации о пользователе
$user = $client->getUserInfo($token['access_token']);

// 5. Обновление токена
$newToken = $client->refreshToken($token['refresh_token']);

Пример сервера

// Инициализация сервера
$server = \IO\Auth\OAuth2Server::init([
    'issuer' => 'io7-sso',
    'token_manager' => [
        'secret_key' => getenv('JWT_SECRET'),
    ],
]);

// Регистрация клиента
$server->registerClient('my-app', 'app-secret', ['https://myapp.example.com/callback']);

// Получение URL авторизации
$authUrl = $server->getAuthorizationUrl('my-app', 'https://myapp.example.com/callback', ['read']);

// Обмен кода на токены (после авторизации пользователя)
$tokens = $server->exchangeCode($code, 'my-app', 'app-secret');

// Обновление токена
$newTokens = $server->refreshToken($refreshToken, 'my-app', 'app-secret');

// Валидация токена
$payload = $server->validateToken($accessToken);
Prev
Социальная авторизация
Next
Keycloak