Назад к блогу
08.04.2026 16:23:44

Авторизация через ЕСИА (Госуслуги) на сайте 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. Сохранение данных в профиле пользователя.

Дополнительно реализуется интеграция с формами сайта для автоматического заполнения данных без участия пользователя.

Результатом является единая точка входа через ЕСИА и автоматическое использование данных пользователя во всех бизнес-процессах сайта.