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

Социальная авторизация — IO7 Framework

Внимание

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

  • Обзор
    • Зависимость
  • Конфигурация
    • Через init()
    • Через provider()
  • Методы
    • getInstance(): self
    • init(array $providers): self
    • provider(string $name, array $config): self
    • redirect(string $name): string
    • callback(string $name): array
    • user(string $name): ?array
    • getProviders(): array
    • isConfigured(string $name): bool
  • Пример полного цикла
    • Маршрут перенаправления
    • Настройка .env

Обзор

IO\Auth\SocialiteManager — менеджер социальной авторизации на основе Laravel Socialite. Поддерживает провайдеры: Google, GitHub, Facebook, Yandex, VK. Реализован как singleton.

Зависимость

{
    "laravel/socialite": "^5.0"
}

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

Через init()

$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',
    ],
    'github' => [
        'client_id' => getenv('GITHUB_CLIENT_ID'),
        'client_secret' => getenv('GITHUB_CLIENT_SECRET'),
        'redirect' => 'https://example.com/auth/github/callback',
    ],
]);

Через provider()

$socialite = \IO\Auth\SocialiteManager::getInstance();
$socialite->provider('yandex', [
    'client_id' => getenv('YANDEX_CLIENT_ID'),
    'client_secret' => getenv('YANDEX_CLIENT_SECRET'),
    'redirect' => 'https://example.com/auth/yandex/callback',
]);

Методы

getInstance(): self

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

$socialite = \IO\Auth\SocialiteManager::getInstance();

init(array $providers): self

Инициализация провайдеров социальной авторизации.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$providersarray<string, array{client_id: string, client_secret: string, redirect: string}>—ДаКонфигурация провайдеров
ВозвратselfЭкземпляр SocialiteManager
$socialite->init([
    'google' => [
        'client_id' => 'your_client_id',
        'client_secret' => 'your_client_secret',
        'redirect' => 'https://example.com/auth/google/callback',
    ],
    'facebook' => [
        'client_id' => 'your_client_id',
        'client_secret' => 'your_client_secret',
        'redirect' => 'https://example.com/auth/facebook/callback',
    ],
]);

provider(string $name, array $config): self

Настроить провайдер социальной авторизации.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$namestring—ДаИмя провайдера (google, github, facebook, yandex, vk)
$configarray{client_id: string, client_secret: string, redirect: string}—ДаКонфигурация провайдера
ВозвратselfЭкземпляр SocialiteManager
$socialite->provider('github', [
    'client_id' => 'your_client_id',
    'client_secret' => 'your_client_secret',
    'redirect' => 'https://example.com/auth/github/callback',
]);

redirect(string $name): string

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

ПараметрТипЗначение по умолчаниюОбязателенОписание
$namestring—ДаИмя провайдера
ВозвратstringURL для редиректа
Исключение\InvalidArgumentExceptionЕсли провайдер не настроен
$redirectUrl = $socialite->redirect('google');
header('Location: ' . $redirectUrl);

callback(string $name): array

Обработать callback от провайдера авторизации.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$namestring—ДаИмя провайдера
Возвратarray['user' => ['id', 'name', 'email', 'avatar'], 'token' => ['access_token', 'token_type', 'expires_in']]
Исключение\InvalidArgumentExceptionЕсли провайдер не настроен
Исключение\RuntimeExceptionЕсли не удалось получить пользователя
$result = $socialite->callback('google');
$userId = $result['user']['id'];
$userEmail = $result['user']['email'];
$accessToken = $result['token']['access_token'];

user(string $name): ?array

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

ПараметрТипЗначение по умолчаниюОбязателенОписание
$namestring—ДаИмя провайдера
Возвратarray|null['id', 'name', 'email', 'avatar'] или null
$userInfo = $socialite->user('github');
if ($userInfo !== null) {
    echo $userInfo['name'];
}

getProviders(): array

Получить список настроенных провайдеров.

ПараметрТипЗначение по умолчаниюОбязателенОписание
Возвратarray<string, array>Конфигурация провайдеров
$providers = $socialite->getProviders();

isConfigured(string $name): bool

Проверить, настроен ли провайдер.

ПараметрТипЗначение по умолчаниюОбязателенОписание
$namestring—ДаИмя провайдера
Возвратbooltrue если провайдер настроен
if ($socialite->isConfigured('google')) {
    // Провайдер настроен
}

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

Маршрут перенаправления

// GET /auth/{provider}
class AuthRoute extends \IO\Route
{
    public static function routes(\IO\App $app): void
    {
        $app->add_route([
            'url' => '/auth/{provider}',
            'method' => 'actionRedirect',
            'type' => ['get'],
            'class_name' => self::class,
        ]);

        $app->add_route([
            'url' => '/auth/{provider}/callback',
            'method' => 'actionCallback',
            'type' => ['get'],
            'class_name' => self::class,
        ]);
    }

    public function actionRedirect(): void
    {
        $provider = $this->args['provider'];
        $socialite = \IO\Auth\SocialiteManager::getInstance();
        $url = $socialite->redirect($provider);
        header('Location: ' . $url);
    }

    public function actionCallback(): void
    {
        $provider = $this->args['provider'];
        $socialite = \IO\Auth\SocialiteManager::getInstance();
        $result = $socialite->callback($provider);

        $user = $this->findOrCreateUser($result['user'], $provider);

        $token = new \IO\JWTToken();
        $token->setUserData($user);
        $jwt = $token->encode(file_get_contents(JWT_PRIVATE_KEY));

        iosetcookie(JWT_COOKIE, $jwt, ['expires' => $token->expired]);

        header('Location: /dashboard');
    }
}

Настройка .env

# Google
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret

# GitHub
GITHUB_CLIENT_ID=your_github_client_id
GITHUB_CLIENT_SECRET=your_github_client_secret

# Facebook
FACEBOOK_CLIENT_ID=your_facebook_client_id
FACEBOOK_CLIENT_SECRET=your_facebook_client_secret

# Yandex
YANDEX_CLIENT_ID=your_yandex_client_id
YANDEX_CLIENT_SECRET=your_yandex_client_secret

# VK
VK_CLIENT_ID=your_vk_client_id
VK_CLIENT_SECRET=your_vk_client_secret
Prev
JWT авторизация
Next
OAuth2