OAuth клиент для PHP: полное руководство по интеграции аутентификации
OAuth (Open Authorization) — это открытый протокол авторизации, который позволяет предоставить третьей стороне ограниченный доступ к ресурсам пользователя без передачи логина и пароля. В мире PHP существует несколько библиотек для реализации OAuth 2.0, но одной из самых популярных и поддерживаемых является League\OAuth2-Client (The PHP League). Эта библиотека предоставляет гибкий и безопасный способ интеграции входа через Google, Facebook, GitHub, VK (ВКонтакте), Yandex и многие другие сервисы.
В данной статье мы подробно разберём установку, настройку и использование OAuth клиента для PHP на примере аутентификации через Google и VK. Вы узнаете, как получить access token, refresh token и данные профиля пользователя.
Установка OAuth клиента через Composer
Для начала работы необходимо установить основную библиотеку и провайдеры (адаптеры для конкретных сервисов). Выполните в терминале:
composer require league/oauth2-client
composer require league/oauth2-google
composer require league/oauth2-vk
Библиотека поддерживает PSR-7 (HTTP-сообщения) и PSR-18 (HTTP-клиент), поэтому рекомендуется также установить Guzzle или любой другой совместимый HTTP-клиент:
composer require guzzlehttp/guzzle
Базовая архитектура OAuth 2.0
OAuth 2.0 в PHP работает по следующей схеме:
- Client ID и Client Secret — получаете при регистрации приложения в сервисе (Google Cloud Console, VK Developers и т.д.).
- Redirect URI — URL на вашем сайте, куда сервис перенаправит пользователя после авторизации.
- Authorization Code — временный код, который обменивается на access token.
- Access Token — ключ для доступа к API пользователя.
- Refresh Token — позволяет обновить access token без повторной авторизации.
Пример: вход через Google
Создадим простой обработчик для аутентификации через Google. Предполагается, что у вас уже есть client_id и client_secret.
Шаг 1. Перенаправление пользователя на страницу авторизации Google
<?php
require 'vendor/autoload.php';
$provider = new \League\OAuth2\Client\Provider\Google([
'clientId' => 'ВАШ_CLIENT_ID',
'clientSecret' => 'ВАШ_CLIENT_SECRET',
'redirectUri' => 'https://ваш-сайт.ru/callback.php',
]);
// Генерируем URL для авторизации
$authUrl = $provider->getAuthorizationUrl([
'scope' => ['email', 'profile'], // запрашиваемые разрешения
]);
// Сохраняем state в сессии для защиты от CSRF
$_SESSION['oauth2state'] = $provider->getState();
header('Location: ' . $authUrl);
exit;
Шаг 2. Обработка callback (callback.php)
<?php
session_start();
require 'vendor/autoload.php';
$provider = new \League\OAuth2\Client\Provider\Google([
'clientId' => 'ВАШ_CLIENT_ID',
'clientSecret' => 'ВАШ_CLIENT_SECRET',
'redirectUri' => 'https://ваш-сайт.ru/callback.php',
]);
// Проверяем state для предотвращения CSRF-атак
if (empty($_GET['state']) || ($_GET['state'] !== $_SESSION['oauth2state'])) {
unset($_SESSION['oauth2state']);
exit('Invalid state');
}
try {
// Обмениваем authorization code на access token
$accessToken = $provider->getAccessToken('authorization_code', [
'code' => $_GET['code']
]);
// Получаем данные профиля пользователя
$resourceOwner = $provider->getResourceOwner($accessToken);
$user = $resourceOwner->toArray();
echo "Привет, " . htmlspecialchars($user['name']) . "!";
echo "Email: " . htmlspecialchars($user['email']);
// Сохраняем токен в БД для дальнейших запросов
} catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) {
exit('Ошибка авторизации: ' . $e->getMessage());
}
Пример: вход через ВКонтакте (VK)
VK использует собственный протокол OAuth, но библиотека League предоставляет провайдер. Установите его через Composer (если ещё не сделали):
composer require league/oauth2-vk
Код аутентификации практически идентичен, меняются только параметры провай