ESIAに接続するためのPython 3ライブラリ-esia-connector

それはすべて、通信省が公共サービスポータルの使用を許可して、州外のWebサイト上のユーザーを識別および認証するという事実から始まりました。 これは、ESIAサービス(識別および認証の統一システム-esia.gosuslugi.ru )を使用して実装されます。 私たちのプロジェクトの顧客は、ESIAとの統合の申請書を提出した最初の5人の参加者であり、この統合をサポートするタスクを表明しました。



無料アクセスでは、当社の技術スタックに適したオープンで無料のソリューションが見つからなかったため、開発後、顧客の祝福を受けて、独自の(BSDライセンス)を共有することにしました。



そこで、opensslユーティリティを使用するPython 3で書かれたesia-connectorプロジェクトを、Debianベースのシステムでのみテストしました。



パッケージ: pypi.python.org/pypi/esia-connector

プロジェクト: github.com/eigenmethod/esia-connector





ESIAとは何か、それが提供する機会は何なのか、私はお話ししません。現在のライブラリの実装の可能性についてのみです。

esia-connectorでできること:





使用する



ライブラリを使用してESIAに接続するには、手元にある必要があります。

  1. ガイドラインに記載されている形式で発行または自己署名され、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暗号ハッシュアルゴリズムをサポートしています。

  2. ESIAが発行した企業アカウントは、戦闘サーバーとテストサーバーでサポートされています。 そのため、EsiaSettingsオブジェクトの作成時に、文字列「YOUR_SYSTEM_ID」の代わりに指定する必要があります。
  3. ESIAテストおよびバトルサーバー上のユーザーアカウントは、デバッグおよびテスト用です。
  4. 受信したトークンを検証するための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、私たちは喜んでそれを含めます。



できること:

  1. 使いやすくするために、ライブラリインターフェイスを再編成します。
  2. opensslを使用してpyopensslに置き換えます。
  3. ESIAから他のデータを取得する機能を開発します。
  4. ESIAに実装された代替データ交換プロトコル(SAML)をサポートします。
  5. 人気のあるフレームワークのラッパーを実装することができます。たとえば、個別のプロジェクトの一部としてDjango、Flaskを実装できます。




参照資料



  1. ESIAの使用に関するガイドライン: minsvyaz.ru/ru/documents/4243
  2. 情報のやり取りのルール: www.minsvyaz.ru/ru/documents/4244
  3. ESIAとの統合の可能性に関するニュース: www.kommersant.ru/doc/2832483
  4. オープンソースの PHP実装: github.com/fr05t1k/esia



All Articles