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

SberId

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

Назначение: Реализация авторизации через Сбер ID. Отличается повышенной сложностью из-за работы с SSL-сертификатами и проверки JWT-токенов вручную. Позволяет автоматически «склеивать» аккаунты, если у пользователя в Сбере и на сайте совпадает телефон или Email.

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

  • Модуль: socialservices, main.
  • Интерфейс: Xpage\Core\Interface\IAuthenticationId.
  • Хелпер настроек: Xpage\Core\Facade\Helper.
  • Логирование: CEventLog.

getAuthorizationLink($phone, $backUrl)

Статический метод для формирования URL, на который нужно отправить пользователя для авторизации.

  • Nonce: Генерирует уникальное число для защиты от атак повторного воспроизведения (Replay-атаки) и сохраняет его в сессию.
  • Параметры: Передает client_id, scope (запрашиваемые данные: телефон, email, имя) и state (ID сессии для безопасности).
  • Redirect URI: Автоматически вычисляется через роутер (xpage_core_auth_sber_id).

Authorize()

Основной метод-обработчик (вызывается в роуте после возвращения пользователя от Сбера).

  • Проверка токена: Сначала получает access_token через getAccessToken.
  • Поиск пользователя: Если в токене есть уникальный ID Сбера (sub), класс сначала ищет пользователя по XML_ID.
  • Регистрация/Обновление: Если пользователь новый, запрашивает расширенные данные (getUserInfo), формирует массив полей через prepareUser и авторизует в Битриксе.

prepareUser($arSberUser) (private)

Метод "маппинга" данных и предотвращения дублей.

  • Склейка аккаунтов: Ищет существующего пользователя в БД по Email или Телефону. Если находит — авторизует в существующий аккаунт и обновляет пустые поля (имя, фамилия, телефон).
  • Форматирование: Приводит номера телефонов к чистому цифровому виду, а имена — к правильному регистру.

gateway($url, $headers, $body) (private)

Низкоуровневая обертка над cURL.

  • SSL Сертификат: Критически важная часть. Сбер требует передачу сертификата (CURLOPT_SSLCERT), путь к которому берется из настроек модуля.
  • Безопасность: Использует версию TLS 1.2.

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

Получение ссылки для кнопки «Войти через Сбер ID»

use Xpage\Core\Service\Authentication\SberId;

try {
$url = SberId::getAuthorizationLink(null, '/personal/');
// Выводим ссылку в шаблоне: <a href="<?=$url?>">Войти через Сбер</a>
} catch (\Exception $e) {
// Если в админке не заполнены client_id или путь к сертификату
error_log($e->getMessage());
}

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

В файле routes.php вызывается именно этот механизм:

// Внутри анонимной функции в routes.php
if ($state === bitrix_sessid() && $code) {
$clAuthSberId = new SberId($code); // В конструкторе произойдет обмен кода на токен
$clAuthSberId->Authorize(); // Здесь произойдет логин и редирект
}

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

  • JWT Token: В методе getAccessToken происходит парсинг JWT-токена (id_token) без использования сторонних библиотек (через base64_decode и json_decode).
  • Аналитика: Метод sendAnalytics уведомляет Сбер об успешном завершении процесса авторизации (требование API Сбера).
  • Яндекс-алиасы: В методе prepareUser есть интересная проверка на YaId::isYandexEmail. Это нужно, потому что почты @yandex.ru, @ya.ru и т.д. являются зеркалами, и код пытается найти пользователя по всем возможным вариантам написания почты.