OAuth Plugin
Плагин triangle/oauth предоставляет мощную систему OAuth-аутентификации с поддержкой множества популярных провайдеров.
Установка
composer require triangle/oauth
Поддерживаемые провайдеры
Плагин поддерживает 50+ провайдеров, включая:
- Социальные сети: Google, Facebook, Twitter, LinkedIn, VKontakte, Yandex, Mail.ru
- Разработка: GitHub, GitLab, Bitbucket
- Мессенджеры: Discord, Telegram, Slack
- Игровые: Steam, Twitch
- Прочее: Apple, Amazon, PayPal, Spotify и многие другие
Полный список провайдеров см. в репозитории.
Конфигурация
Настройка провайдера
В config/plugins/oauth.php:
return [
'providers' => [
'google' => [
'client_id' => env('GOOGLE_CLIENT_ID'),
'client_secret' => env('GOOGLE_CLIENT_SECRET'),
'redirect_uri' => 'http://localhost:88/auth/google/callback',
],
'facebook' => [
'client_id' => env('FACEBOOK_APP_ID'),
'client_secret' => env('FACEBOOK_APP_SECRET'),
'redirect_uri' => 'http://localhost:88/auth/facebook/callback',
],
],
'storage' => \Triangle\OAuth\Storage\Session::class,
];
Получение учетных данных
-
Google:
- Перейдите на Google Cloud Console
- Создайте проект и OAuth 2.0 credentials
-
Facebook:
- Перейдите на Facebook Developers
- Создайте приложение
Использование
Инициализация провайдера
use Triangle\OAuth\OAuth;
$oauth = new OAuth();
// Google
$google = $oauth->provider('google', [
'client_id' => 'your-client-id',
'client_secret' => 'your-client-secret',
'redirect_uri' => 'http://localhost:88/auth/google/callback',
]);
Авторизация
<?php
namespace App\Controller;
use Triangle\OAuth\OAuth;
use Triangle\Engine\Request;
class AuthController
{
public function redirectToGoogle(OAuth $oauth)
{
$provider = $oauth->provider('google');
$authorizationUrl = $provider->getAuthorizationUrl();
// Сохранение state для защиты от CSRF
session()->set('oauth_state', $provider->getState());
return redirect($authorizationUrl);
}
public function handleGoogleCallback(Request $request, OAuth $oauth)
{
$provider = $oauth->provider('google');
// Проверка state
$state = $request->input('state');
if ($state !== session()->get('oauth_state')) {
throw new \Exception('Invalid state');
}
// Обмен кода на токен
$accessToken = $provider->getAccessToken('authorization_code', [
'code' => $request->input('code'),
]);
// Получение данных пользователя
$userData = $provider->getUserProfile($accessToken);
// Работа с данными пользователя
// ...
return response()->json($userData);
}
}
Получение профиля пользователя
$profile = $provider->getUserProfile($accessToken);
// Доступные поля:
$profile->identifier; // Уникальный ID
$profile->email; // Email
$profile->firstName; // Имя
$profile->lastName; // Фамилия
$profile->photoURL; // URL фото
Работа с токенами
// Сохранение токена
session()->set('oauth_token', $accessToken);
// Использование сохраненного токена
$token = session()->get('oauth_token');
$profile = $provider->getUserProfile($token);
Маршруты
Определите маршруты для OAuth:
// config/route.php
use Triangle\Router\Route;
Route::get('/auth/{provider}', [AuthController::class, 'redirectToProvider']);
Route::get('/auth/{provider}/callback', [AuthController::class, 'handleProviderCallback']);
Примеры для разных провайдеров
GitHub
$github = $oauth->provider('github', [
'client_id' => env('GITHUB_CLIENT_ID'),
'client_secret' => env('GITHUB_CLIENT_SECRET'),
'redirect_uri' => 'http://localhost:88/auth/github/callback',
]);
VKontakte
$vkontakte = $oauth->provider('vkontakte', [
'client_id' => env('VK_APP_ID'),
'client_secret' => env('VK_SECRET_KEY'),
'redirect_uri' => 'http://localhost:88/auth/vkontakte/callback',
]);
Безопасность
- Всегда проверяйте
stateпараметр для защиты от CSRF - Используйте HTTPS в production
- Храните секреты в переменных окружения
- Не сохраняйте чувствительные данные в сессиях без шифрования