Социальная авторизация — IO7 Framework
Внимание
Данная статья документации написана нейросетью. Возможны некоторые расхождения и неточность информации!
Обзор
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
Инициализация провайдеров социальной авторизации.
| Параметр | Тип | Значение по умолчанию | Обязателен | Описание |
|---|---|---|---|---|
$providers | array<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
Настроить провайдер социальной авторизации.
| Параметр | Тип | Значение по умолчанию | Обязателен | Описание |
|---|---|---|---|---|
$name | string | — | Да | Имя провайдера (google, github, facebook, yandex, vk) |
$config | array{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 для редиректа к провайдеру авторизации.
| Параметр | Тип | Значение по умолчанию | Обязателен | Описание |
|---|---|---|---|---|
$name | string | — | Да | Имя провайдера |
| Возврат | string | URL для редиректа | ||
| Исключение | \InvalidArgumentException | Если провайдер не настроен |
$redirectUrl = $socialite->redirect('google');
header('Location: ' . $redirectUrl);
callback(string $name): array
Обработать callback от провайдера авторизации.
| Параметр | Тип | Значение по умолчанию | Обязателен | Описание |
|---|---|---|---|---|
$name | string | — | Да | Имя провайдера |
| Возврат | 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
Получить информацию о пользователе из провайдера.
| Параметр | Тип | Значение по умолчанию | Обязателен | Описание |
|---|---|---|---|---|
$name | string | — | Да | Имя провайдера |
| Возврат | 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
Проверить, настроен ли провайдер.
| Параметр | Тип | Значение по умолчанию | Обязателен | Описание |
|---|---|---|---|---|
$name | string | — | Да | Имя провайдера |
| Возврат | bool | true если провайдер настроен |
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