Перейти к основному содержимому

VkId

Класс: Xpage\Core\Service\Authentication\VkId

Назначение: Полноценная интеграция с экосистемой VK ID. Поддерживает регистрацию новых пользователей, авторизацию существующих по телефону/email и автоматическую загрузку персональных данных (включая фото и дату рождения) с соблюдением современных стандартов безопасности (PKCE).

Зависимости:

  • Модуль: socialservices, main.
  • Интерфейс: Xpage\Core\Interface\IAuthenticationId.
  • Хелпер настроек: Xpage\Core\Facade\Helper.
  • Ядро: Bitrix\Main\Web\HttpClient.

getAuthorizationLink($provider, $scheme, $backUrl)

Статический метод для генерации ссылки на авторизацию в VK.

  • PKCE: Генерирует уникальный verifier (сохраняется в сессию) и преобразует его в code_challenge, который отправляется в VK. Это защищает от перехвата кода авторизации.
  • Гибкость: Поддерживает выбор провайдера (vkid, ok_ru, mail_ru) и цветовой схемы (light, dark).
  • Scope: Запрашивает доступ к email и phone.

Authorize()

Основной метод-обработчик после возврата пользователя из VK.

  • Обмен токена: Получает access_token через getAccessToken.
  • Получение данных: Запрашивает расширенный профиль через getUserInfo.
  • Логирование: В случае ошибок (неверный код, истекший токен) записывает подробности в CEventLog (тип USER_LOGIN).
  • Редирект: В случае успеха отправляет на backUrl или на главную.

prepareUser($arVkUser) (private)

Метод подготовки данных и синхронизации с базой данных сайта.

  • Маппинг данных: Переносит из VK имя, фамилию, почту, телефон, пол, дату рождения и аватар (через CFile::MakeFileArray).
  • Склейка аккаунтов: Ищет существующего пользователя по Email или Телефону.
    • Если найден — авторизует в него.
    • Дозаполняет пустые поля в профиле (если в VK данных больше, чем было на сайте).
  • Яндекс-логика: Использует YaId для проверки алиасов почты (чтобы user@yandex.ru и user@ya.ru считались одним аккаунтом).

getAccessToken($code) (private)

Метод для прямого обмена временного кода на постоянный токен доступа.

  • Использует встроенный в Битрикс класс HttpClient.
  • Передает code_verifier из сессии для прохождения проверки PKCE на стороне VK.

Примеры использования

Получение ссылки для кнопки входа

use Xpage\Core\Service\Authentication\VkId;

try {
// Получаем ссылку для входа через Одноклассники в темной теме
$url = VkId::getAuthorizationLink('ok_ru', 'dark', '/personal/orders/');
echo '<a href="' . $url . '">Войти через OK</a>';
} catch (\Exception $e) {
echo "Ошибка конфигурации: " . $e->getMessage();
}

Обработка Callback в роуте

В routes.php логика выглядит так:

// Маршрут: /api-internal/user/vk-id
$code = $request->get('code');
$device = $request->get('device_id');

if ($state === bitrix_sessid() && $code && $device) {
$clAuthVkId = new VkId($code, $device);
$clAuthVkId->Authorize(); // Выполнит вход и редирект
}

Технические особенности

  • Работа с изображениями: В отличие от многих других сервисов, здесь реализовано сохранение аватара пользователя из VK в профиль Битрикса.
  • PKCE: Это более безопасный метод OAuth. VK требует отправлять хешированную строку в code_challenge при запросе ссылки и оригинал строки в code_verifier при получении токена.
  • HttpClient: Вместо cURL используется стандартный Bitrix\Main\Web\HttpClient, что делает код более переносимым и соответствующим стандартам D7.