OAuth клиент для PHP: аутентификация через социальные сети и API

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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

Код аутентификации практически идентичен, меняются только параметры провай

Рекомендаций