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и т.д. являются зеркалами, и код пытается найти пользователя по всем возможным вариантам написания почты.