Обзор сессий — IO7 Framework
Внимание
Данная статья документации написана нейросетью. Возможны некоторые расхождения и неточность информации!
Обзор
Модуль сессий IO7 предоставляет комплексные инструменты для управления авторизацией и сессиями пользователей. Включает JWT-токены, OAuth2, социальную авторизацию, кроссдоменную SSO и интеграцию с Keycloak.
Требования: PHP ^8.2, Illuminate (Laravel 13)
Архитектура
IO\Auth\TokenManager — Единый менеджер токенов (HS256 + RS256)
IO\Auth\OAuth2Server — OAuth2 сервер (authorization code flow)
IO\Auth\OAuth2Client — OAuth2 клиент (для подключения к SSO)
IO\Auth\SocialiteManager — Социальная авторизация (Google, GitHub, Facebook, Yandex, VK)
IO\Auth\CrossDomainSSO — Кроссдоменная SSO (обмен токенами между доменами)
IO\Auth\KeycloakManager — Интеграция с Keycloak (egov, aitu)
IO\Session — Управление сессиями пользователей
Зависимости
{
"firebase/php-jwt": "~6.10.0",
"laravel/socialite": "^5.0",
"league/oauth2-server": "^8.0",
"guzzlehttp/guzzle": "^7.0"
}
Конфигурация (.env)
# JWT
JWT_COOKIE=io7_token
JWT_PUBLIC_KEY=path/to/public.pem
JWT_PRIVATE_KEY=path/to/private.pem
JWT_LOGIN_SALSA=secret_salt
# OAuth2
OAUTH2_CLIENT_ID=your_client_id
OAUTH2_CLIENT_SECRET=your_client_secret
OAUTH2_AUTH_URL=https://sso.example.com/authorize
OAUTH2_TOKEN_URL=https://sso.example.com/token
# Socialite
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret
GOOGLE_REDIRECT_URI=https://example.com/auth/google/callback
# Keycloak
KEYCLOAK_BASE_URL=https://auth.example.com
KEYCLOAK_REALM=my-realm
KEYCLOAK_CLIENT_ID=my-client
KEYCLOAK_CLIENT_SECRET=my-secret
# Cross-Domain SSO
SSO_BASE_URL=https://sso.example.com
SSO_SECRET=your-sso-secret
Схема авторизации
Пользователь → Cookie (JWT) → Session::create() → JWTToken::parse()
↓
TokenManager::validate()
↓
Session->isAuth() = true
Быстрый старт
Создание сессии
$session = \IO\Session::create();
if ($session->isAuth()) {
$userId = $session->getUserID();
$login = $session->getUserLogin();
}
Создание JWT токена
$token = new \IO\JWTToken();
$token->setUserData([
'id' => 123,
'login' => 'john_doe',
'sname' => 'Doe',
'fname' => 'John',
'pol' => 1,
]);
$token->session = 'session_id';
$token->expired = time() + 3600;
$jwtString = $token->encode(file_get_contents('private.pem'));
OAuth2 авторизация
$client = new \IO\Auth\OAuth2Client(
'client_id',
'client_secret',
'https://sso.example.com/authorize',
'https://sso.example.com/token',
'https://sso.example.com/userinfo'
);
$url = $client->getAuthorizationUrl('https://myapp.example.com/callback', ['openid', 'profile']);
header('Location: ' . $url);
Социальная авторизация
$socialite = \IO\Auth\SocialiteManager::getInstance();
$socialite->init([
'google' => [
'client_id' => getenv('GOOGLE_CLIENT_ID'),
'client_secret' => getenv('GOOGLE_CLIENT_SECRET'),
'redirect' => 'https://example.com/auth/google/callback',
],
]);
$redirectUrl = $socialite->redirect('google');
header('Location: ' . $redirectUrl);
Кроссдоменная SSO
$sso = \IO\Auth\CrossDomainSSO::init([
'sso_base_url' => 'https://sso.example.com',
'sso_secret' => 'your-secret-key',
]);
$token = $sso->getCrossDomainToken('user-123', ['role' => 'admin']);
$validated = $sso->validateCrossDomainToken($token, 'example.com');
Keycloak
$keycloak = \IO\Auth\KeycloakManager::init([
'base_url' => 'https://auth.example.com',
'realm' => 'my-realm',
'client_id' => 'my-client',
'client_secret' => 'my-secret',
]);
$authUrl = $keycloak->getAuthorizationUrl('https://example.com/callback', ['openid', 'email']);