適用対象:
従業員テナント
外部テナント (詳細)
このチュートリアルでは、Python Flask Web アプリのセキュリティ保護について説明します。
このチュートリアルでは、次の操作を行います。
- Python Flask プロジェクトを作成する
- 必要な依存関係をインストールする
- 認証に Microsoft ID プラットフォームを使用するように Flask Web アプリを構成する
- Flask Web アプリでサインインとサインアウトのエクスペリエンスをテストする
[前提条件]
- 従業員テナント。 既定のディレクトリを使用するか、新しいテナントを設定できます。
-
この組織のディレクトリ内のアカウント専用に構成された Microsoft Entra 管理センターに新しいアプリを登録します。 詳細については、「 アプリケーションの登録 」を参照してください。 後で使用するために、アプリケーション の [概要 ] ページから次の値を記録します。
- アプリケーション (クライアント) ID
- ディレクトリ (テナント) ID
- アプリの登録にクライアント シークレットを追加します。 運用アプリではクライアント シークレットを使用しないでください。 代わりに、証明書またはフェデレーション資格情報を使用してください。 詳細については、「 アプリケーションに資格情報を追加する」を参照してください。
- Python 3 以降。
- Visual Studio Code または別のコードエディター。
Flask プロジェクトを作成する
Flask-web-app など、Flask アプリケーションをホストするフォルダーを作成します。
コンソール ウィンドウを開き、コマンドを使用して Flask Web アプリ フォルダーのディレクトリに移動します
cd flask-web-app仮想環境を設定する
オペレーティング システムに応じて、次のコマンドを実行して仮想環境を設定し、アクティブ化します。
Windows オペレーティング システムの場合:
py -m venv .venv .venv\scripts\activatemacOS または Linux オペレーティング システムの場合:
python3 -m venv .venv source .venv/bin/activate
アプリの依存関係をインストールする
アプリの依存関係をインストールするには、次のコマンドを実行します。
pip install flask
pip install python-dotenv
pip install requests
pip install "ms_identity_python[flask] @ git+https://github.com/azure-samples/ms-identity-python@0.9"
インストールする ms_identity_python ライブラリでは、依存関係として Python 用 Microsoft Authentication Library (MSAL) が自動的にインストールされます。 MSAL Python は、ユーザーの認証とアクセス トークンの管理を可能にするライブラリです。
必要なライブラリをインストールしたら、次のコマンドを実行して要件ファイルを更新します。
pip freeze > requirements.txt
認証用にアプリケーションを構成する
Microsoft ID プラットフォームを使用してユーザーをサインインする Web アプリケーションは、構成ファイル .env を使用して構成されます。 Python Flask では、次の値を指定する必要があります。
| 環境変数 | Description |
|---|---|
AUTHORITY |
アプリケーションが登録されているクラウド インスタンスの URL。 形式: https://{Instance}/{TenantId}. 次のいずれかのインスタンス値を使用します。- https://login.microsoftonline.com/ (Azure パブリック クラウド)- https://login.microsoftonline.us/ (Azure 米国政府機関)- https://login.microsoftonline.de/ (Microsoft Entra Germany)- https://login.partner.microsoftonline.cn/ (21Vianet が運営する Microsoft Entra China) |
TENANT_ID |
アプリが登録されているテナントの識別子。 アプリの登録からテナント ID を優先するか、次のいずれかを使用します。 - organizations: 職場または学校アカウントのユーザーのサインイン- common: 職場または学校アカウントまたは Microsoft 個人アカウントを使用してユーザーをサインインします- consumers: Microsoft 個人アカウントでのみユーザーをサインインさせる |
CLIENT_ID |
アプリ登録から取得したアプリケーション (クライアント) の識別子。 |
CLIENT_SECRET |
Microsoft Entra 管理センターで 資格情報を追加 して取得したシークレット値。 |
REDIRECT_URI |
認証後に Microsoft ID プラットフォームがセキュリティ トークンを送信する URI。 |
構成ファイルを更新する
ルート フォルダーに .env ファイルを作成して、アプリの構成を安全に格納します。 .env ファイルには、次の環境変数が含まれている必要があります。
CLIENT_ID="<Enter_your_client_id>" CLIENT_SECRET="<Enter_your_client_secret>" AUTHORITY="https://login.microsoftonline.com/<Enter_tenant_id>" REDIRECT_URI="<Enter_redirect_uri>"プレースホルダーを次の値に置き換えます。
-
<Enter_your_client_id>を、登録したクライアント Web アプリのアプリケーション (クライアント) ID に置き換えます。 -
<Enter_tenant_id>を、Web アプリを登録したディレクトリ (テナント) ID に置き換えます。 -
<Enter_your_client_secret>を、作成した Web アプリのクライアント シークレット値に置き換えます。 このチュートリアルでは、デモンストレーションのためにシークレットを使用します。 運用環境では、 証明書やフェデレーション ID 資格情報などのより安全な方法を使用します。 -
<Enter_redirect_uri>を、先ほど登録したリダイレクト URI に置き換えます。 このチュートリアルでは、リダイレクト URI パスをhttp://localhost:3000/getATokenに設定します。
-
環境変数を読み取り、必要な他の構成を追加する app_config.py ファイルを作成します。
import os AUTHORITY = os.getenv("AUTHORITY") CLIENT_ID = os.getenv("CLIENT_ID") CLIENT_SECRET = os.getenv("CLIENT_SECRET") REDIRECT_URI = os.getenv("REDIRECT_URI") SESSION_TYPE = "filesystem" # Tells the Flask-session extension to store sessions in the filesystem. Don't use in production apps.
アプリ エンドポイントを構成する
この段階では、Web アプリ エンドポイントを作成し、ビジネス ロジックをアプリケーションに追加します。
ルート フォルダーに app.py という名前のファイルを作成します。
必要な依存関係を app.py ファイルの先頭にインポートします。
import os import requests from flask import Flask, render_template from identity.flask import Auth import app_configFlask アプリを初期化し、 app_config.py ファイルで指定したセッション ストレージの種類を使用するように構成します。
app = Flask(__name__) app.config.from_object(app_config)アプリ クライアントを初期化します。 Flask Web アプリは機密クライアントです。 クライアントシークレットを、機密クライアントが安全に保存できるため、提供します。 内部では、ID ライブラリは MSAL ライブラリの
ConfidentialClientApplicationクラスを呼び出します。auth = Auth( app, authority=app.config["AUTHORITY"], client_id=app.config["CLIENT_ID"], client_credential=app.config["CLIENT_SECRET"], redirect_uri=app.config["REDIRECT_URI"] )必要なエンドポイントを Flask アプリに追加します。 Web アプリは、承認コード フローを使用してユーザーをサインインします。 ms_identity_python MSAL ラッパー ライブラリは、MSAL ライブラリとの対話に役立ちます。そのため、サインインを追加してアプリにサインアウトすることが容易になります。 インデックス ページを追加し、
login_required提供される デコレーターを使用して保護します。login_requiredデコレーターにより、認証されたユーザーのみがインデックス ページにアクセスできるようになります。@app.route("/") @auth.login_required def index(*, context): return render_template( 'index.html', user=context['user'], title="Flask Web App Sample", )このビューを
@login_requiredで装飾したため、ユーザーが存在することが保証されます。
アプリ テンプレートを作成する
ルート フォルダーにテンプレートという名前 の フォルダーを作成します。 templates フォルダーに、 index.htmlという名前のファイルを作成します。 これはアプリのホームページです。 index.html ファイルに次のコードを追加します。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
<h1>{{ title }}</h1>
<h2>Welcome {{ user.get("name") }}!</h2>
<img src="https://github.com/Azure-Samples/ms-identity-python-webapp-django/raw/main/static/topology.png" alt="Topology">
<ul>
{% if api_endpoint %}
<!-- If an API endpoint is declared and scopes defined, this link will show. We set this in the call an API tutorial. For this tutorial, we do not define this endpoint. -->
<li><a href='/call_api'>Call an API</a></li>
{% endif %}
<li><a href="{{ url_for('identity.logout') }}">Logout</a></li>
</ul>
<hr>
<footer style="text-align: right">{{ title }}</footer>
</body>
</html>
サンプル Web アプリを実行してテストする
ご利用のターミナルで、次のコマンドを実行します。
python3 -m flask run --debug --host=localhost --port=3000選択したポートを使用できます。 このポートは、先ほど登録したリダイレクト URI のポートに似ている必要があります。
ブラウザーを開き、
http://localhost:3000に移動します。 サインイン ページが表示されます。手順に従って、Microsoft アカウントでサインインします。 サインインするための電子メール アドレスとパスワードを指定するように求められます。
アプリケーションで必要なスコープがある場合は、同意画面が表示されます。 アプリケーションは、アクセスを許可するデータへのアクセスを維持し、サインインするためのアクセス許可を要求します。 を選択し、を同意します。 スコープが定義されていない場合、この画面は表示されません。
サインインまたはサインアップすると、Web アプリにリダイレクトされます。 次のスクリーンショットのようなページが表示されます。
[ ログアウト ] を選択してアプリからサインアウトします。 サインアウトするアカウントを選択するように求められます。 サインインに使用したアカウントを選択します。