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.