RnD Soft Модуль авторизации ЕСИА (лицензии), Модуль интеграции с ЕСИА на языке программирования Java — купить лицензию Модуль авторизации ЕСИА, цена в Ростове-на-Дону на официальном сайте

На что стоит обратить внимание

Если вы планируете внедрять такое решение, учтите, что зарегистрировать организацию в ЕСИА могут только представители, которые имеют право подписи документов от организации и для этого им не требуется доверенность. Таким человеком может быть, например, директор.

Сегодня для регистрации организации в системе мы рекомендуем нашим клиентам:

  1. Получить квалифицированную электронную подпись (КЭП) на руководителя организации или ее подразделения.
  2. Выполнить регистрацию организации в профиле ЕСИА.

Это надёжный способ авторизации для клиентов любой государственной организации. Отдельные учётные записи, которых может быть много, заменяет единственный аккаунт в «Госуслугах», который позволит использовать любые услуги на разных ресурсах. Задуматься об интеграции с ЕСИА в ближайшей перспективе мы рекомендуем всем компаниям, связанным со страхованием и банковским делом.

Что делать и как?

Сначала нам показалось, что в интеграции с ЕСИА нет ничего особенного с технической точки зрения — стандартная задача, связанная с получением данных посредством REST API. Однако, при ближайшем рассмотрении стало понятно, что не всё так просто. Например, выяснилось, что у нас нет представления о том, как работать с сертификатами, необходимыми для подписи нескольких параметров. Пришлось тратить время и разбираться. Но обо всем по порядку.

Для начала важно было наметить план действий. Наш план включал следующие основные шаги:

  1. зарегистрироваться на технологическом портале ЕСИА;
  2. подать заявки на использование программных интерфейсов ЕСИА в тестовой и промышленной среде;
  3. самостоятельно разработать механизм взаимодействия с ЕСИА (в соответствии с действующим документом «Методические рекомендации по использованию ЕСИА»);
  4. протестировать работу механизма в тестовой и промышленной среде ЕСИА.

Обычно мы разрабатываем наши проекты на Java. Поэтому для программной реализации выбрали:

Что теперь делать со всеми этими данными?

Мы можем сделать парсинг данных и получать объекты с требуемыми полями. Здесь каждый разработчик может оформлять классы как ему необходимо, в соответствии с техническим заданием.

Похожее:  Как подключить ЕСИА на сайт — кейс от специалистов WebCanape

Пример получения объекта с необходимыми полями:

final ObjectMapper objectMapper = new ObjectMapper()
	.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

String personDataEntityString = esiaPersonDataFetcher
	.apply(ESIA_REST_API_URL   "/prns/"   esiaAccountId);

EsiaPersonDto esiaPersonDto = objectMapper
	.readValue(personDataEntityString, EsiaPersonDto.class);

Заполняем объект esiaPersonDto необходимыми данными, например, контактами:

for (String contactUrl : esiaListDto.getElementUrls()) {
  String contactEntityString = esiaPersonDataFetcher.apply(contactUrl);
  EsiaContactDto esiaContactDto = objectMapper.readValue(contactEntityString, EsiaContactDto.class); // Десериализация контакта
  if (esiaContactDto.getType() == null) continue;
  switch (esiaContactDto.getType().toUpperCase()) {
    case EsiaContactDto.MBT: // Если это номер мобильного телефона, то заполним поле mobilePhone
      esiaPersonDto.setMobilePhone(esiaContactDto.getValue());
      break;
    case EsiaContactDto.EML: // Если это адрес электронной почты, то заполним поле email
      esiaPersonDto.setEmail(esiaContactDto.getValue());
  }
}

Класс EsiaPersonDto выглядит следующим образом:

@Data
@FieldNameConstants(prefix = "")
public class EsiaPersonDto {

  private String firstName;
  private String lastName;
  private String middleName;
  private String birthDate;
  private String birthPlace;
  private Boolean trusted;  // тип учетной записи - подтверждена (“true”) / не подтверждена (“false”)
  private String status;    // статус УЗ - Registered (зарегистрирована) /Deleted (удалена)
  // Назначение полей непонятно, но они есть при запросе /prns/{oid}
  private List<String> stateFacts;
  private String citizenship;
  private Long updatedOn;
  private Boolean verifying;
  @JsonProperty("rIdDoc")
  private Integer documentId;
  private Boolean containsUpCfmCode;
  @JsonProperty("eTag")
  private String tag;
  // ----------------------------------------
  private String mobilePhone;
  private String email;

  @javax.validation.constraints.Pattern(regexp = "(\d{2})\s(\d{2})")
  private String docSerial;

  @javax.validation.constraints.Pattern(regexp = "(\d{6})")
  private String docNumber;

  private String docIssueDate;

  @javax.validation.constraints.Pattern(regexp = "([0-9]{3})\-([0-9]{3})")
  private String docDepartmentCode;

  private String docDepartment;

  @javax.validation.constraints.Pattern(regexp = "\d{14}")
  @JsonProperty("snils")
  private String pensionFundCertificateNumber;

  @javax.validation.constraints.Pattern(regexp = "\d{12}")
  @JsonProperty("inn")
  private String taxPayerNumber;

  @JsonIgnore
  @javax.validation.constraints.Pattern(regexp = "\d{2}")
  private String taxPayerCertificateSeries;

  @JsonIgnore
  @javax.validation.constraints.Pattern(regexp = "\d{10}")
  private String taxPayerCertificateNumber;
}

Работа по усовершенствованию сервиса будет продолжаться, ведь ЕСИА не стоит на месте.

С чего всё начиналось

Среди наших заказчиков — органы государственной власти. Один из крупных проектов — это сайт администрации города Смоленска. В 2022 году в WebCanape обратились их представители с просьбой разработать сервис на сайте для приема обращений граждан. Он нужен для того, чтобы все горожане получили возможность подать заявку, жалобу, предложение по благоустройству города или решить вопросы по работе коммунальных служб. Также жители города смогут отследить статус запроса — этапы обработки и исполнение.

Мы не первый раз работали с администрацией нашего города, поэтому знали их требования к защите информации пользователей. ЕСИА — самый надёжный способ подтверждения личности. Поэтому мы поставили вопрос необходимости использования интеграции личного кабинета с ЕСИА на самом начальном этапе согласования проекта.

Github – kmorpex/esia-gosuslugi: модуль аутентификации и авторизации в есиа

Модуль идентификации и авторизации пользователей через ЕСИА для Node.js с поддержкой ГОСТ 34.10

Перед использованием ознакомтесь с документацией.

  1. Установите
  1. Создайте экземпляр подключения к ЕСИА
  1. Направьте пользвателя в ЕСИА для получения подтверждения
  1. После того как пользователь авторизуется и даст разрешение на доступ к своим данным, он будет перенаправлен по адресу, указанному в redirectUri. Вы получите параметр code, который нужно будет использовать для запроса данных

Метод getAccess возвращает Promise, в который приходит объект результата. Этот объект содержит два поля:

  • marker – маркер доступа. Объект, содержащий поля:
    • response – объект, ответ от ЕСИА при запросе маркера
    • decodedAccessToken – объект, jwt декодированное значение поля access_token, содержащееся в response.
  • data – массив записей данных о пользователе.

В метод getAccess вторым параметром можно передать массив путей для получения записей данных о пользователе. Они будут содержаться в ответе, в поле data, описанном выше. Если параметр не передавать, по умолчанию будет использоваться [‘/’]. Если передать null, то данные о пользователе запрашиваться не будут.

Подробнее о получении информации о пользователе читайте в официальной документации ЕСИА.

Rnd soft модуль авторизации есиа (лицензии), модуль интеграции с есиа на языке программирования java — купить лицензию модуль авторизации есиа, цена в ростове-на-дону на официальном сайте

Модуль авторизации ЕСИА представляет собой набор файлов c исходным кодом. Имеются модификации на языках программирования PHP, C# (.Net), Java, Ruby, Python, а также готовые компоненты для CMS Bitrix (1С-Битрикс «Управление сайтом» и «Корпоративный портал»), WordPress, Drupal и Joomla.  Модуль  авторизации ЕСИА поддерживает биометрическую идентификацию и соответствует требованиями Методических рекомендаций единой биометрической системы (ЕБС) и Методическим рекомендациям по использованию Единой системы идентификации и аутентификации.

Модуль реализует методы, необходимые для обеспечения процедур «Регламента информационного взаимодействия Участников с Оператором ЕСИА» и с учетом «Методических рекомендаций по использованию Единой системы идентификации и аутентификации». В частности, содержит методы для реализации следующих действий:

✅ Купите RnD Soft Модуль авторизации ЕСИА (лицензии), Модуль интеграции с ЕСИА на языке программирования Java на официальном сайте

✅ Лицензия RnD Soft Модуль авторизации ЕСИА (лицензии), Модуль интеграции с ЕСИА на языке программирования Java по выгодной цене

✅ RnD Soft Модуль авторизации ЕСИА (лицензии), Модуль интеграции с ЕСИА на языке программирования Java, лицензионное программное обеспечение купите в Ростове-на-Дону и других городах России

Предлагаем также:

Авторизация (получение авторизационного кода)

Параметры:

Примеры:

Для инициации процесса идентификации и аутентификации пользователей через ЕСИА необходимо сформировать авторизационный запрос и передать его на соответствующий URL шлюза. Для пользователя с вышеуказанными параметрами ссылка будет иметь следующий вид.

Выписка с данными в исходном виде:

Получение данных о документах в исходном виде происходит так же путем указания scope.Сервис доступен для типов документов VEHICLE_INFO (Выписка
о транспортном средстве по владельцу), ILS_PFR (Cведения о состоянии индивидуального
страхового счета застрахованного лица)

, PAYOUT_INCOME (Сведения о доходах
физического лица и о выплатах страховых взносов, произведенных в пользу физического
лица). Но в случае запроса данных ответ может поступить не сразу, а в течении некоторого времени.В случае, если сведение запрошено в ведомстве и ответ еще не поступил, возвращается
идентификатор этого запроса и идентификатор пользователя (oid).

С помощью идентификатора
запроса осуществляется процесс обработки персональных данных. Для возможности получения
сведения о выписки транспортого средства по владельцу необходимо обновить запрос. Перечень
параметров, которые возвращаются по каждому типу документа (doc_type), приведен в разделе
7.2 методических рекомендаций.

Пример ответа в случае запроса openid и fullname из защищённого хранилища ЕСИА:

{"sub":"3","info":{"uid":"1000486446","stateFacts":["EntityRoot"],"firstName":"Тимофей","lastName":"Сазонов","middleName":"Трофимович","trusted":true,"updatedOn":1633359785,"status":"REGISTERED","verifying":true,"rIdDoc":160710,"containsUpCfmCode":false,"eTag":"A543E45F09EDC6AEE19530A674E636B54F9A29CC"}}

Выход из системы есиа

Параметры:

Для получения данных отправляется GET запрос

Для инициации процесса выхода из системы ЕСИА необходимо сформировать авторизационный запрос и передать его на соответствующий URL шлюза. Для пользователя с вышеуказанными параметрами ссылка будет иметь следующий вид:

ВАЖНО! Путь возврата пользователя обязательно должен быть указан в соответствующей КИС

Доступ к сервисам шлюза

Для доступа к сервисам шлюза необходимо с помощью функциональных инструментов его административной панели создать КИС, указав в её параметрах «Пути возврата» – URL-адрес(а) клиентской ИС (потребителя идентификации), на которые шлюз будет отвечать после выполнения авторизации.

Для доступа к сервисам шлюза потребуются следующие реквизиты:

Значение идентификатора и секрета для КИС берутся из её параметров в административной панели шлюза.

ЕСИА Шлюз не занимается валидацией скоупов, переданных клиентской системой. Скоупы просто передаются в ЕСИА. Поэтому .well-known/openid-configuration содержит пустой массив в scopes_supported.

Зачем нам нужна интеграция с есиа?

В связи с пандемией коронавируса количество офлайн сделок во многих направлениях кредитования начало сокращаться. Клиенты стали «уходить в онлайн», и для нас было жизненно важно укрепить своё онлайн-присутствие на рынке автокредитования. В процессе доработки сервиса «Автокредит» (на Хабре уже есть

) мы решили сделать интерфейс заведения кредитных заявок на сайте банка максимально удобным и простым. Интеграция с ЕСИА стала ключевым моментом в решении этой задачи, поскольку позволила автоматически получить персональные данные клиента.

Общие положения

Взаимодействие клиентской системы с сервисами шлюза, обеспечивающими идентификацию пользователей через ЕСИА, происходит через стандартный протокол OAuth 2.0/OpenID Connect. Авторизация в ЕСИА происходит, в данном случае, как обычная OAuth авторизация.

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

Чтобы начать работу с ЕСИА Шлюзом необходимо интегрировать в целевую информационную систему одно из готовых средств, реализующих работу с протоколом OAuth 2.0.

Спецификация OpenID Connect

Подготовка к разработке

Потребовалось около месяца, чтобы подключить к ЕСИА личный кабинет: была сделана регистрация аккаунта организации на технологическом портале ЕСИА, с последующей выдачей доступа сотруднику этой организации, получены данные от Минцифры, выполнены работы по интеграции информационных систем.

Получение url для переадресации

Первый шаг ― это получение авторизационного кода. В нашем случае это делает отдельный сервис с переадресацией на страницу авторизации портала Госуслуг (расскажем об этом немного подробнее).

Сначала мы инициализируем переменные ESIA_AUTH_URL (адрес ЕСИА) и API_URL (адрес, на который происходит редирект в случае успешной авторизации). После этого создаем объект EsiaRequestParams, который содержит в своих полях параметры запроса к ЕСИА, и сформируем ссылку esiaAuthUri.

public Response loginByEsia() throws Exception {
  final String ESIA_AUTH_URL = dao.getEsiaAuthUrl(); // Адрес ЕСИА
  final String API_URL = dao.getApiUrl(); // Адрес, на который произойдет редирект с случае успешной авторизации
  EsiaRequestParams requestDto = new EsiaRequestParams(API_URL);
  URI esiaAuthUri = new URIBuilder(ESIA_AUTH_URL)
          .addParameters(Arrays.asList(
            new BasicNameValuePair(RequestEnum.CLIENT_ID.getParam(), requestDto.getClientId()),
            new BasicNameValuePair(RequestEnum.SCOPE.getParam(), requestDto.getScope()),
            new BasicNameValuePair(RequestEnum.RESPONSE_TYPE.getParam(), requestDto.getResponseType()),
            new BasicNameValuePair(RequestEnum.STATE.getParam(), requestDto.getState()),
            new BasicNameValuePair(RequestEnum.TIMESTAMP.getParam(), requestDto.getTimestamp()),
            new BasicNameValuePair(RequestEnum.ACCESS_TYPE.getParam(), requestDto.getAccessType()),
            new BasicNameValuePair(RequestEnum.REDIRECT_URI.getParam(), requestDto.getRedirectUri()),
            new BasicNameValuePair(RequestEnum.CLIENT_SECRET.getParam(), requestDto.getClientSecret())
          ))
          .build();
  return Response.temporaryRedirect(esiaAuthUri).build();
}


Для наглядности покажем, как может выглядеть класс EsiaRequestParams:

public class EsiaRequestParams {

  String clientId;
  String scope;
  String responseType;
  String state;
  String timestamp;
  String accessType;
  String redirectUri;
  String clientSecret;
  String code;
  String error;
  String grantType;
  String tokenType;

  public EsiaRequestParams(String apiUrl) throws Exception {
    this.clientId = CLIENT_ID;
    this.scope = Arrays.stream(ScopeEnum.values())
            .map(ScopeEnum::getName)
            .collect(Collectors.joining(" "));
    responseType = RESPONSE_TYPE;
    state = EsiaUtil.getState();
    timestamp = EsiaUtil.getUrlTimestamp();
    accessType = ACCESS_TYPE;
    redirectUri = apiUrl   RESOURCE_URL   "/"   AUTH_REQUEST_ESIA;
    clientSecret = EsiaUtil.generateClientSecret(String.join("", scope, timestamp, clientId, state));
    grantType = GRANT_TYPE;
    tokenType = TOKEN_TYPE;
  }
}

Получение данных пользователя

В нашем случае необходимо получить ФИО, дату рождения, паспортные данные и контакты.

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

Получение токена


Следующий шаг ― получение маркера доступа (он же токен) в обмен на авторизационный код, который был получен в качестве параметра при успешной авторизации пользователя на портале Госуслуг.

Для получения каких-либо данных в ЕСИА нужно получить токен доступа. Для этого формируем запрос в ЕСИА. Основные поля запроса тут формируются аналогичным образом, в коде получается примерно следующее:

Рецепты nginx: авторизация через есиа

Для приготовления авторизации через ЕСИА нам понадобится сам

nginx

и его плагины

encrypted-session

,

headers-more

,

auth_request

,

uuid4

,

set-misc

,

echo

,

json

,

sign

,

jwt

. (Я дал ссылки на свои форки, т.к. делал некоторые изменения, которые пока не удалось пропихнуть в оригинальные репозитории. Можно также воспользоваться

готовым образом

.)

Для начала зададим

encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";

Дальше, на всякий случай, отключаем авторизационный заголовок

more_clear_input_headers Authorization;

Теперь защищаем всё авторизацией

auth_request /auth;
location =/auth {
    internal;
    set_decode_base64 $auth_decode $cookie_auth; # раскодируем авторизационную куку
    set_decrypt_session $auth_decrypt $auth_decode; # расшифровываем авторизационную куку
    if ($auth_decrypt = "") { return 401 UNAUTHORIZED; } # если не удалось расшифровать, то значит пользователь не авторизован
    more_set_input_headers "Authorization: Basic $auth_decrypt"; # подменить авторизацию на basic (чтобы использовать переменную $remote_user)
    echo -n OK; # пользователь авторизован
}

Для авторизованных пользователей показываем контент из их папки

location / {
    alias html/$remote_user/;
}

А при отсутствии авторизации перенаправляем на ЕСИА

error_page 401 = @error401;
location @error401 {
    set $client_id мнемоника; # задаём мнемонику ЕСИА
    set $scope openid; # задаём запрашиваемые скоупы
    uuid4 $state; # генерируем случайное состояние
    set_formatted_local_time $timestamp "%Y.%m.%d %H:%M:%S %z"; # задаем дату-время в требуемом ЕСИА формате
    sign_certificate /data/nginx/esia.crt; # задаём сертификат (который мы загрузили в ЕСИА)
    sign_certificate_key /data/nginx/esia.key; # задаём приватный ключ
    sign_set $client_secret $scope$timestamp$client_id$state; # подписываем необходимые ЕСИА параметры
    set_escape_uri $access_type_escape online; # задаём необходимый ЕСИА способ доступа и кодируем его
    set_escape_uri $client_id_escape $client_id; # кодируем мнемонику
    set_escape_uri $client_secret_escape $client_secret; # кодируем подпись
    set_escape_uri $request_uri_escape $request_uri; # кодируем исходный запрос
    set_escape_uri $redirect_uri_escape $scheme://$server_name:$server_port/login?request_uri=$request_uri_escape; # задаём и кодируем адрес возврата
    set_escape_uri $response_type_escape code; # задаём и кодируем тип ответа
    set_escape_uri $scope_escape $scope; # кодируем скоупы
    set_escape_uri $state_escape $state; # кодируем состояние
    set_escape_uri $timestamp_escape $timestamp; # кодируем дату-время
    return 303 https://esia.gosuslugi.ru/aas/oauth2/ac?access_type=$access_type_escape&client_id=$client_id_escape&client_secret=$client_secret_escape&redirect_uri=$redirect_uri_escape&response_type=$response_type_escape&scope=$scope_escape&state=$state_escape&timestamp=$timestamp_escape; # перенаправляем на ЕСИА

После успешной авторизации пользователя в ЕСИА, его перенаправляет на адрес возврата

location =/login {
    auth_request off; # не использовать авторизацию
    auth_jwt_key /data/nginx/esia.pub file; # задаём публичный ключ (который мы получили от ЕСИА) для расшифровки токена
    auth_jwt $arg_code; # задаём токен
    json_loads $jwt_grant_json $jwt_grant; # парсим тело токена в переменную
    json_dumps $oid $jwt_grant_json urn:esia:sbj urn:esia:sbj:oid; # извлекаем oid
    try_files /try?username=$oid; # перенаправляем на дальнейшую обработку
}
location =/try {
    internal;
    if ($arg_username = "") { return 401 UNAUTHORIZED; } # если oid не получен, то значит пользователь не авторизован
    encrypted_session_expires 43200; # задаём время жизни сессии 12 часов (12 * 60 * 60 = 43200)
    set_secure_random_alphanum $password 8; # задаём случайный пароль для basic авторизации
    set $username_password ESIA-$arg_username:$password; # задаём basic авторизацию
    set_encode_base64 $username_password_encode $username_password; # кодируем basic авторизацию
    set_encrypt_session $auth_encrypt $username_password_encode; # зашифровываем basic авторизацию
    set_encode_base64 $auth_encode $auth_encrypt; # кодируем зашифрованную basic авторизацию
    add_header Set-Cookie "Auth=$auth_encode; Max-Age=43200"; # помещаем зашифрованную basic авторизацию в авторизационную куку на 12 часов (12 * 60 * 60 = 43200)
    set $arg_request_uri_or_slash $arg_request_uri; # копируем запрос из аргумента
    set_if_empty $arg_request_uri_or_slash "/"; # если аргумент не задан, то начало
    set_unescape_uri $request_uri_unescape $arg_request_uri_or_slash; # раскодируем запрос
    return 303 $request_uri_unescape; # перенаправляем на сохранённый запрос
}

Этапы реализации проекта

После регистрации и согласования технического задания, мы приступили к реализации модуля авторизации через ЕСИА в личном кабинете. К сожалению, не обошлось без сложностей. В ходе работы выяснилось, что на web-сервере администрации установлена ОС Windows, а это автоматически усложняет процесс внедрения нового стандарта ГОСТ 2022 по криптозащите.

Если вы планируете заняться разработкой похожего проекта, то рекомендуем ОС Unix для web-сервера — это сэкономит ваше время и деньги заказчика.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *