Библиотека Python 3 Для Подключения К Есиа — Esia-Connector

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

Это реализуется с помощью сервиса ЕСИА (Единая система идентификации и аутентификации – esia.gosuslugi.ru ).

Заказчик нашего проекта стал одним из первых 5 участников, подавших заявки на интеграцию с Единой системой идентификации и автономной авторизации, в результате чего перед нами стояла задача поддержать эту интеграцию.

В открытом доступе мы не нашли открытого бесплатного решения, подходящего для нашего стека технологий, поэтому после разработки, с благословения заказчика, решили поделиться своим (лицензией BSD).

Итак, представляем вам проект esia-connector, написанный на Python 3, использует утилиту openssl, протестированную только в системах на базе Debian. Полиэтиленовый пакет: pypi.python.org/pypi/esia-connector Проект: github.com/eigenmethod/esia-connector Я не буду вам рассказывать, что такое ЕСИА, какие возможности она предоставляет, только о возможностях текущего внедрения нашей библиотеки.

esia-коннектор позволяет:

  • пройти аутентификацию в ЕСИА, получить в ответ токен (по которому потом можно будет идентифицировать пользователя), проверить его;
  • получить персональные данные пользователя: ФИО, реквизиты документов, удостоверяющих личность (паспорта, водительские права), контактные данные (телефоны, адрес электронной почты), ИНН, СНИЛС, адреса (прописки и регистрации).



Применение

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

    Выдержка из рекомендаций Выдать ключевой контейнер и сертификат ключа квалифицированной электронной подписи для подключаемой информационной системы (должен содержать ОГРН юридического лица - оператора информационной системы).

    Дополнительно возможна работа с ключевым контейнером и сертификатом ключа для неквалифицированной электронной подписи в формате X.509 версии 3. В этом случае можно самостоятельно сгенерировать (например, с помощью утилиты keytool из Java Development Kit) контейнер ключей и самозаверяющий сертификат для вашей системы.

    Сертификат необходим для идентификации ИП при взаимодействии с Единой системой самоидентификации.

    ЕСИА поддерживает алгоритмы формирования электронной подписи RSA с длиной ключа 2048 бит и алгоритм криптографического хеширования SHA-256, а также алгоритм электронной подписи ГОСТ Р 34.10-2001 и алгоритм криптографического хеширования ГОСТ Р 34.11-94.

  2. Аккаунт компании, выданный службой поддержки ЕСИА на производственном и тестовом серверах.

    Затем его необходимо указать при создании объекта EsiaSettings вместо строки «YOUR_SYSTEM_ID».

  3. Учетные записи пользователей на тестовых и рабочих серверах ESIA для отладки и тестирования.

  4. Открытые ключи ЕСИА (тестовый и боевой) для проверки полученного токена.

    Эти ключи не являются общедоступными; техническая поддержка высылает их по электронной почте по запросу.

Для запуска тестового примера (минимальное веб-приложение Flask доступно в репозитории библиотеки) вам необходимо поместите сертификат, предварительно загруженный на сервер ESIA, в файл «esia-connector/examples/res/test.crt».

В том же каталоге вы должны поместить свой закрытый ключ под именем «test.key», а упомянутый выше открытый ключ должен быть помещен под именем «esia_pub.key».

Затем запустите приложение Flask, из каталога примеров выполните:

  
   

python flask_app.py

На главной странице мы увидим правильно сформированную ссылку для доступа к Единому идентификационному номеру, при нажатии на которую сервер Единого идентификационного номера обработает данные в GET-запросе, запросит у пользователя логин и пароль для Единого идентификационного номера.

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

Пример использования esia-коннектора

import os from flask import Flask, request from esia_connector.client import EsiaSettings, EsiaAuth def get_test_file(name): return os.path.join(os.path.dirname(__file__), 'res', name) TEST_SETTINGS = EsiaSettings(esia_client_id='YOUR SYSTEM ID', redirect_uri=' http://localhost:5000/info ', certificate_file=get_test_file('test.crt'), private_key_file=get_test_file('test.key'), esia_token_check_key=get_test_file('esia_pub.key'), esia_service_url=' https://esia-portal1.test.gosuslugi.ru ', esia_scope='openid http://esia.gosuslugi.ru/usr_inf ') assert TEST_SETTINGS.esia_client_id != 'YOUR SYSTEM ID', "Please specify real system id!" assert os.path.exists(TEST_SETTINGS.certificate_file), "Please place your certificate in res/test.crt !" assert os.path.exists(TEST_SETTINGS.private_key_file), "Please place your private key in res/test.key!" assert os.path.exists(TEST_SETTINGS.esia_token_check_key), "Please place ESIA public key in res/esia_pub.key !" app = Flask(__name__) esia_auth = EsiaAuth(TEST_SETTINGS) @app.route("/") def hello(): url = esia_auth.get_auth_url() return 'Start here: <a href="{0}">{0}</a>'.

format(url) @app.route("/info") def process(): code = request.args.get('code') state = request.args.get('state') esia_connector = esia_auth.complete_authorization(code, state) inf = esia_connector.get_person_main_info() return "%s" % inf if __name__ == "__main__": app.run()



Выполнение

Структура библиотеки тривиальна и не требует комментариев.

После ее написания стало понятно, что ее можно было бы спроектировать лучше, чтобы пользователю библиотеки нужно было совершать меньше действий с ее интерфейсом.

Стоит отметить, что для подписи используется утилита openssl; следовательно, существует дополнительная операция по созданию временного файла.

Мы довольны текущей реализацией, но было бы лучше использовать pyopenssl. Планов по развитию библиотеки у нас нет, пока нет требований в проекте, и их нет в ближайшее время.

Если вы используете esia-connector в своих проектах и по ходу дела что-то добавляете/исправляете, пиаримся, мы будем рады это включить.

Что можно сделать:

  1. Реорганизуйте интерфейс библиотеки, чтобы упростить ее использование.

  2. Замените использование openssl на pyopenssl.
  3. Разработать функционал для получения иных данных из Единой информационной системы идентификации и автономной информации.

  4. Поддержка альтернативного протокола обмена данными, реализованного в ЕСИА (SAML).

  5. Возможна реализация оберток для популярных фреймворков, например: Django, Flask, в рамках отдельных проектов.



Ссылки

  1. Рекомендации по использованию единой системы идентификации и аутентификации: minsvyaz.ru/ru/documents/4243
  2. Регламент информационного взаимодействия: www.minsvyaz.ru/ru/documents/4244
  3. Новости о возможности интеграции с ЕСИА: www.kommersant.ru/doc/2832483
  4. Открытая реализация на PHP: github.com/fr05t1k/esia
Теги: #python #python3 #веб-разработка #госуслуги #essia #open source #python
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.