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

Кроссдоменная SSO — IO7 Framework

Внимание

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

  • Обзор
  • Инициализация
    • Конфигурация
  • Методы
    • init(array $config): self
    • getInstance(): self
    • getCrossDomainToken(string $userId, array $data = []): string
    • validateCrossDomainToken(string $token, string $domain): ?array
    • exchangeToken(string $token, string $fromDomain, string $toDomain): ?string
    • createSessionCookie(string $userId): string
    • validateSessionCookie(string $cookie): ?array
  • Пример: Кроссдоменная SSO (VKPlay-style)
    • 1. SSO сервер (sso.example.com)
    • 2. Клиентский домен (app1.example.com)
    • 3. JavaScript на клиенте

Обзор

IO\Auth\CrossDomainSSO — класс для кроссдоменной авторизации. Позволяет пользователям, авторизованным на одном домене, получать доступ к другим доменам без повторного входа. Использует механизм обмена токенами вместо сторонних cookies.

Формат токена: base64url(header).base64url(payload).base64url(hmac) — не JWT.

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

$sso = \IO\Auth\CrossDomainSSO::init([
    'sso_base_url' => 'https://sso.example.com',
    'sso_secret'   => 'your-secret-key',
]);

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

ПараметрТипЗначение по умолчаниюОбязателенОписание
sso_base_urlstring—ДаБазовый URL SSO-сервера (обязательный)
sso_secretstring—ДаОбщий секрет для HMAC-подписи (обязательный)

Методы

init(array $config): self

Инициализация SSO-клиента.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$configarray{sso_base_url: string, sso_secret: string}—ДаКонфигурация
ВозвратselfЭкземпляр CrossDomainSSO
Исключение\InvalidArgumentExceptionЕсли sso_base_url или sso_secret пустые
CrossDomainSSO::init([
    'sso_base_url' => 'https://sso.example.com',
    'sso_secret' => 'my-secret-key',
]);

getInstance(): self

Получить единственный экземпляр класса. Должен вызываться после init().

ПараметрТипЗначение по умолчаниюОбязателенОписание
ВозвратselfЭкземпляр CrossDomainSSO
Исключение\RuntimeExceptionЕсли init() не был вызван
$sso = CrossDomainSSO::getInstance();

getCrossDomainToken(string $userId, array $data = []): string

Создать токен для кроссдоменной авторизации.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$userIdstring—ДаИдентификатор пользователя
$dataarray[]НетДополнительные данные (например, ['role' => 'admin'])
ВозвратstringПодписанный токен
$token = $sso->getCrossDomainToken('user-123', [
    'role'  => 'admin',
    'email' => 'user@example.com',
]);

validateCrossDomainToken(string $token, string $domain): ?array

Валидация токена с другого домена.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$tokenstring—ДаТокен для проверки
$domainstring—ДаДомен, для которого был выдан токен
Возвратarray|nullДанные токена или null если невалиден
$data = $sso->validateCrossDomainToken($token, 'example.com');
if ($data !== null) {
    echo 'User: ' . $data['user_id'];
}

exchangeToken(string $token, string $fromDomain, string $toDomain): ?string

Обмен токеном между доменами.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$tokenstring—ДаИсходный токен
$fromDomainstring—ДаДомен-источник
$toDomainstring—ДаДомен-получатель
Возвратstring|nullНовый токен или null при ошибке
$newToken = $sso->exchangeToken(
    $token,
    'app1.example.com',
    'app2.example.com'
);

createSessionCookie(string $userId): string

Создать cookie для сессии.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$userIdstring—ДаИдентификатор пользователя
ВозвратstringЗначение cookie
$cookie = $sso->createSessionCookie('user-123');
setcookie('sso_session', $cookie, [
    'path'     => '/',
    'secure'   => true,
    'httponly'  => true,
    'samesite' => 'Lax',
]);

validateSessionCookie(string $cookie): ?array

Валидация cookie сессии.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$cookiestring—ДаЗначение cookie
Возвратarray|nullДанные сессии или null
$session = $sso->validateSessionCookie($_COOKIE['sso_session'] ?? '');
if ($session !== null) {
    $userId = $session['user_id'];
}

Пример: Кроссдоменная SSO (VKPlay-style)

1. SSO сервер (sso.example.com)

$sso = \IO\Auth\CrossDomainSSO::init([
    'sso_base_url' => 'https://sso.example.com',
    'sso_secret' => getenv('SSO_SECRET'),
]);

// POST /api/sso/exchange
class SsoExchangeApi extends \IO\Api\CrudApi
{
    public function doPostData(ApiResult $result, array $params): ApiResult
    {
        $sso = CrossDomainSSO::getInstance();
        $token = $params['token'] ?? '';
        $fromDomain = $params['from_domain'] ?? '';
        $toDomain = $params['to_domain'] ?? '';

        $newToken = $sso->exchangeToken($token, $fromDomain, $toDomain);

        return $result->showSuccess([
            'token' => $newToken,
        ]);
    }
}

2. Клиентский домен (app1.example.com)

// Проверка сессии через AJAX
class CheckSessionApi extends \IO\Api\CrudApi
{
    public function doGetData(ApiResult $result, array $params): ApiResult
    {
        $sso = CrossDomainSSO::getInstance();
        $cookie = $_COOKIE['sso_session'] ?? '';

        $session = $sso->validateSessionCookie($cookie);

        if ($session !== null) {
            return $result->showSuccess([
                'user' => ['id' => $session['user_id']],
            ]);
        }

        return $result->showSuccess([
            'auth_required' => true,
        ]);
    }
}

3. JavaScript на клиенте

async function checkSession() {
    const response = await fetch('https://app1.example.com/api/auth/check', {
        credentials: 'include'
    });
    const data = await response.json();

    if (data.auth_required) {
        // Редирект на SSO
        window.location.href = 'https://sso.example.com/login?redirect=app1.example.com';
    } else {
        console.log('Пользователь:', data.user);
    }
}
Prev
Обзор сессий
Next
JWT авторизация