Авторизация через ЕСИА (Госуслуги) на сайте Bitrix и автозаполнение данных пользователя
Общая задача
Необходимо реализовать вход пользователя на сайт через ЕСИА с последующим получением его персональных данных и использованием этих данных в формах сайта (личный кабинет, оформление заказа, анкеты).
Основная проблема
ЕСИА не является обычным OAuth-провайдером. При интеграции возникают следующие сложности:
1. Требуется регистрация системы в ЕСИА и получение доступа к защищенному API.
2. Используется подпись запросов (JWT + КЭП), без которой невозможно получить access_token.
3. Ответы API имеют специфичную структуру и требуют нормализации перед использованием.
4. В Bitrix отсутствует готовая стандартная интеграция с ЕСИА.
5. Требуется корректная логика сопоставления пользователя ЕСИА с пользователем сайта.
Решение
Реализация выполняется через OAuth 2.0 с дополнительной подписью запросов и последующей обработкой данных пользователя.
Этап 1. Регистрация в ЕСИА
В ЕСИА регистрируется информационная система и получаются параметры:
client_id
client_secret
redirect_uri
сертификат КЭП (ключ + публичный сертификат)
Этап 2. Кнопка авторизации
<a href="/local/esia/login.php">Войти через Госуслуги</a>
Этап 3. Инициализация авторизации
<?php
session_start();
$client_id = 'CLIENT_ID';
$scope = 'fullname email snils';
$redirect_uri = 'https://site.ru/local/esia/callback.php';
$state = bin2hex(random_bytes(16));
$_SESSION['esia_state'] = $state;
$url = "https://esia.gosuslugi.ru/aas/oauth2/ac?" . http_build_query([
'client_id' => $client_id,
'redirect_uri' => $redirect_uri,
'response_type' => 'code',
'scope' => $scope,
'state' => $state
]);
header("Location: " . $url);
exit;
Этап 4. Получение access_token
На данном этапе требуется подпись запроса через JWT и КЭП. Без подписи ЕСИА не вернет токен.
// пример структуры запроса
POST /aas/oauth2/te
grant_type=authorization_code
code=AUTH_CODE
client_id=CLIENT_ID
client_secret=CLIENT_SECRET
redirect_uri=REDIRECT_URI
В реальной интеграции используется подписанный JWT, сформированный через OpenSSL.
Этап 5. Получение данных пользователя
<?php
$access_token = 'TOKEN';
$opts = [
'http' => [
'header' => "Authorization: Bearer " . $access_token
]
];
$context = stream_context_create($opts);
$response = file_get_contents(
"https://esia.gosuslugi.ru/rs/prns",
false,
$context
);
$data = json_decode($response, true);
В ответе приходят данные:
firstName
lastName
middleName
snils
email
Этап 6. Авторизация или регистрация в Bitrix
<?php
use Bitrix\Main\UserTable;
$email = $data['email'] ?: $data['snils'].'@esia.local';
$user = UserTable::getRow([
'filter' => ['=EMAIL' => $email]
]);
if (!$user) {
$cUser = new CUser;
$userId = $cUser->Add([
"LOGIN" => $email,
"EMAIL" => $email,
"NAME" => $data['firstName'],
"LAST_NAME" => $data['lastName'],
"SECOND_NAME" => $data['middleName'],
"PASSWORD" => bin2hex(random_bytes(8)),
"CONFIRM_PASSWORD" => bin2hex(random_bytes(8)),
"ACTIVE" => "Y"
]);
} else {
$userId = $user['ID'];
}
global $USER;
$USER->Authorize($userId);
Этап 7. Автозаполнение форм
<?php
global $USER;
$rsUser = CUser::GetByID($USER->GetID());
$arUser = $rsUser->Fetch();
?>
<input type="text" name="name" value="<?=htmlspecialcharsbx($arUser['NAME'])?>">
<input type="text" name="last_name" value="<?=htmlspecialcharsbx($arUser['LAST_NAME'])?>">
<input type="email" name="email" value="<?=htmlspecialcharsbx($arUser['EMAIL'])?>">
Дополнительные задачи
1. Хранение идентификатора пользователя ЕСИА (например, SNILS или ESIA ID).
2. Обработка обновления данных при повторной авторизации.
3. Связка с заказами и CRM.
4. Логирование ошибок интеграции.
Что требуется для полноценной работы
1. Настроенный HTTPS.
2. Доступ к ЕСИА (прод или тестовая среда).
3. Квалифицированная электронная подпись.
4. Сертификаты и ключи для подписи JWT.
Предложение по реализации
Реализация выполняется как отдельный модуль или набор обработчиков в /local/esia/ с разделением на:
/local/esia/
login.php
callback.php
jwt.php
api.php
В модуле реализуется:
1. Генерация подписанных JWT.
2. Получение access_token.
3. Запрос данных пользователя.
4. Регистрация и авторизация в Bitrix.
5. Сохранение данных в профиле пользователя.
Дополнительно реализуется интеграция с формами сайта для автоматического заполнения данных без участия пользователя.
Результатом является единая точка входа через ЕСИА и автоматическое использование данных пользователя во всех бизнес-процессах сайта.