無料アクセスでは、当社の技術スタックに適したオープンで無料のソリューションが見つからなかったため、開発後、顧客の祝福を受けて、独自の(BSDライセンス)を共有することにしました。
そこで、opensslユーティリティを使用するPython 3で書かれたesia-connectorプロジェクトを、Debianベースのシステムでのみテストしました。
パッケージ: pypi.python.org/pypi/esia-connector
プロジェクト: github.com/eigenmethod/esia-connector
ESIAとは何か、それが提供する機会は何なのか、私はお話ししません。現在のライブラリの実装の可能性についてのみです。
esia-connectorでできること:
- ESIAで認証し、応答でトークンを受け取り(ユーザーを識別するために使用できます)、検証します。
- 個人ユーザーデータを受け取る:氏名、身分証明書のデータ(パスポート、運転免許証)、連絡先情報(電話番号、メールアドレス)、TIN、SNILS、住所(居住地および登録)。
使用する
ライブラリを使用してESIAに接続するには、手元にある必要があります。
- ガイドラインに記載されている形式で発行または自己署名され、ESIAテストおよび戦闘サーバーにアップロードされた証明書。
ガイドラインからの抜粋接続された情報システムのキーコンテナと資格のある電子署名のキー証明書を発行します(情報システムの運営者であるOGRN ULが含まれている必要があります)。 さらに、キーコンテナとX.509バージョン3形式の非修飾電子署名キー証明書の使用がサポートされています。この場合、システムのキーコンテナと自己署名証明書を個別に生成することができます(たとえば、Java Development Kitのkeytoolユーティリティを使用)。 ESIAとやり取りするときにIPを識別するには、証明書が必要です。 ESIAは、2048ビットのキー長のRSA電子署名生成アルゴリズムとSHA-256暗号ハッシュアルゴリズム、およびGOST R 34.10-2001電子署名アルゴリズムとGOST R 34.11-94暗号ハッシュアルゴリズムをサポートしています。
- ESIAが発行した企業アカウントは、戦闘サーバーとテストサーバーでサポートされています。 そのため、EsiaSettingsオブジェクトの作成時に、文字列「YOUR_SYSTEM_ID」の代わりに指定する必要があります。
- ESIAテストおよびバトルサーバー上のユーザーアカウントは、デバッグおよびテスト用です。
- 受信したトークンを検証するためのESIA公開鍵(テストおよび戦闘)。 これらのキーは公開されていません。テクニカルサポートがオンデマンドで電子メールで送信します。
テストケース(最小限のFlask Webアプリケーションはライブラリリポジトリで利用可能)を実行するには、次が必要です。
ESIAサーバーにアップロードされた証明書をファイル「esia-connector / examples / res / test.crt」に配置します。 同じディレクトリに、秘密鍵を「test.key」という名前で配置し、上記の公開鍵を「esia_pub.key」という名前で配置する必要があります。
次に、サンプルディレクトリからFlaskアプリケーションを実行します。
python flask_app.py
メインページにESIAにアクセスするための整形式のリンクが表示されます。クリックすると、ESIAサーバーはGETリクエストでデータを処理し、ESIAのユーザー名とパスワードをユーザーに要求します。許可を発行する場合、テスト例で指定されたページにリダイレクトします。ここでは、リクエストを行っているユーザーの個人データを受信するためのリクエストをいくつか行い、同じページにこのデータを表示します。 。
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を使用し、途中で何かを追加/修正する場合-PR-ones、私たちは喜んでそれを含めます。
できること:
- 使いやすくするために、ライブラリインターフェイスを再編成します。
- opensslを使用してpyopensslに置き換えます。
- ESIAから他のデータを取得する機能を開発します。
- ESIAに実装された代替データ交換プロトコル(SAML)をサポートします。
- 人気のあるフレームワークのラッパーを実装することができます。たとえば、個別のプロジェクトの一部としてDjango、Flaskを実装できます。
参照資料
- ESIAの使用に関するガイドライン: minsvyaz.ru/ru/documents/4243
- 情報のやり取りのルール: www.minsvyaz.ru/ru/documents/4244
- ESIAとの統合の可能性に関するニュース: www.kommersant.ru/doc/2832483
- オープンソースの PHP実装: github.com/fr05t1k/esia