Все началось с того, что Минкомсвязи разрешило использовать портал госуслуг для идентификации и аутентификации пользователей на негосударственных сайтах.
Это реализуется с помощью сервиса ЕСИА (Единая система идентификации и аутентификации – esia.gosuslugi.ru ).
Заказчик нашего проекта стал одним из первых 5 участников, подавших заявки на интеграцию с Единой системой идентификации и автономной авторизации, в результате чего перед нами стояла задача поддержать эту интеграцию.
В открытом доступе мы не нашли открытого бесплатного решения, подходящего для нашего стека технологий, поэтому после разработки, с благословения заказчика, решили поделиться своим (лицензией BSD).
Итак, представляем вам проект esia-connector, написанный на Python 3, использует утилиту openssl, протестированную только в системах на базе Debian. Полиэтиленовый пакет: pypi.python.org/pypi/esia-connector Проект: github.com/eigenmethod/esia-connector Я не буду вам рассказывать, что такое ЕСИА, какие возможности она предоставляет, только о возможностях текущего внедрения нашей библиотеки.
esia-коннектор позволяет:
- пройти аутентификацию в ЕСИА, получить в ответ токен (по которому потом можно будет идентифицировать пользователя), проверить его;
- получить персональные данные пользователя: ФИО, реквизиты документов, удостоверяющих личность (паспорта, водительские права), контактные данные (телефоны, адрес электронной почты), ИНН, СНИЛС, адреса (прописки и регистрации).
Применение
Для того, чтобы подключиться к ЕСИА с помощью библиотеки, необходимо иметь под рукой:- Сертификат, выданный или самоподписанный в формате, описанном в методических рекомендациях, загруженный на тестовый и оперативный сервер ОВОСС.
Выдержка из рекомендаций Выдать ключевой контейнер и сертификат ключа квалифицированной электронной подписи для подключаемой информационной системы (должен содержать ОГРН юридического лица - оператора информационной системы).
Дополнительно возможна работа с ключевым контейнером и сертификатом ключа для неквалифицированной электронной подписи в формате X.509 версии 3. В этом случае можно самостоятельно сгенерировать (например, с помощью утилиты keytool из Java Development Kit) контейнер ключей и самозаверяющий сертификат для вашей системы.
Сертификат необходим для идентификации ИП при взаимодействии с Единой системой самоидентификации.
ЕСИА поддерживает алгоритмы формирования электронной подписи RSA с длиной ключа 2048 бит и алгоритм криптографического хеширования SHA-256, а также алгоритм электронной подписи ГОСТ Р 34.10-2001 и алгоритм криптографического хеширования ГОСТ Р 34.11-94.
- Аккаунт компании, выданный службой поддержки ЕСИА на производственном и тестовом серверах.
Затем его необходимо указать при создании объекта EsiaSettings вместо строки «YOUR_SYSTEM_ID».
- Учетные записи пользователей на тестовых и рабочих серверах ESIA для отладки и тестирования.
- Открытые ключи ЕСИА (тестовый и боевой) для проверки полученного токена.
Эти ключи не являются общедоступными; техническая поддержка высылает их по электронной почте по запросу.
В том же каталоге вы должны поместить свой закрытый ключ под именем «test.key», а упомянутый выше открытый ключ должен быть помещен под именем «esia_pub.key».
Затем запустите приложение Flask, из каталога примеров выполните:
На главной странице мы увидим правильно сформированную ссылку для доступа к Единому идентификационному номеру, при нажатии на которую сервер Единого идентификационного номера обработает данные в GET-запросе, запросит у пользователя логин и пароль для Единого идентификационного номера.python flask_app.py
, то после успешного входа запросит разрешение нашему приложению на доступ к Единому идентификационному номеру и в случае, если разрешение предоставлено, перенаправит на страницу, указанную в тестовом примере, где мы с уже полученным токеном сделаем еще пару запросов, чтобы получить персональные данные пользователя, от имени которого мы делаем запрос, и отобразить эти данные на той же странице.
Пример использования 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 в своих проектах и по ходу дела что-то добавляете/исправляете, пиаримся, мы будем рады это включить.
Что можно сделать:
- Реорганизуйте интерфейс библиотеки, чтобы упростить ее использование.
- Замените использование openssl на pyopenssl.
- Разработать функционал для получения иных данных из Единой информационной системы идентификации и автономной информации.
- Поддержка альтернативного протокола обмена данными, реализованного в ЕСИА (SAML).
- Возможна реализация оберток для популярных фреймворков, например: Django, Flask, в рамках отдельных проектов.
Ссылки
- Рекомендации по использованию единой системы идентификации и аутентификации: minsvyaz.ru/ru/documents/4243
- Регламент информационного взаимодействия: www.minsvyaz.ru/ru/documents/4244
- Новости о возможности интеграции с ЕСИА: www.kommersant.ru/doc/2832483
- Открытая реализация на PHP: github.com/fr05t1k/esia
-
Зачем Вам Сайт?
19 Oct, 24 -
Что Такое Собеседование И Зачем Оно Нужно?
19 Oct, 24 -
Здравствуй, Дорогой Дневник...
19 Oct, 24 -
Продюсеров Видеозаписи Обвинили В Заговоре
19 Oct, 24 -
Сколько Процентов Я Должен Взять?
19 Oct, 24 -
Удаление Drm Увеличивает Продажи Музыки Emi
19 Oct, 24 -
100 Лучших Игр Всех Времен. Версия Ign
19 Oct, 24 -
Трудолюбивые Регионы Тянут На Дно
19 Oct, 24