Azure AD B2C を使ってサンプル Python Web アプリケーションで認証を構成する

この記事では、サンプルの Python Web アプリケーションを使用して、Web アプリケーションに Azure Active Directory B2C (Azure AD B2C) 認証を追加する方法を説明します。

概要

OpenID Connect (OIDC) は、OAuth 2.0 を基盤にした認証プロトコルです。 OIDC を使用して、ユーザーを安全にアプリケーションにサインインさせることができます。 このサンプル Web アプリでは、Python 用の Microsoft Authentication Library (MSAL) を使用します。 Python 用 MSAL を使用すると、Python Web アプリに対して簡単に、認証と承認のサポートを追加することができます。

サインイン フローでは、次の手順が実行されます。

  1. ユーザーが Web アプリにアクセスして [サインイン] を選択します。
  2. アプリによって認証要求が開始され、ユーザーが Azure AD B2C にリダイレクトされます。
  3. ユーザーがサインアップまたはサインインパスワードのリセット、またはソーシャル アカウントを使用したサインインを行います。
  4. ユーザーがサインインに成功すると、Azure AD B2C はアプリに ID トークンを返します。
  5. アプリは、承認コードと引き換えに ID トークンを取得し、その ID トークンを検証して要求を読み取った後、安全なページをユーザーに返します。

サインアウト

サインアウト フローには、次の手順が含まれます。

  1. アプリから、ユーザーがサインアウトします。
  2. アプリによってそのセッション オブジェクトがクリアされ、認証ライブラリによってそのトークン キャッシュがクリアされます。
  3. アプリによってユーザーが Azure AD B2C サインアウト エンドポイントに移動し、Azure AD B2C セッションが終了されます。
  4. ユーザーが再びアプリにリダイレクトされます。

前提条件

次が実行されているコンピューター:

手順 1: ユーザー フローを構成する

ユーザーがアプリにサインインしようとすると、ユーザー フローを介した承認エンドポイントへの認証要求がアプリによって開始されます。 ユーザー フローによって、ユーザーのエクスペリエンスが定義および制御されます。 ユーザーがユーザー フローを完了すると、Azure AD B2C によってトークンが生成され、ユーザーはアプリケーションにリダイレクトされます。

ユーザー フローまたはカスタム ポリシーの作成をまだ行っていない場合は、作成します。

手順 2: Web アプリケーションを登録する

アプリケーションが Azure AD B2C でサインインできるようにするには、Azure AD B2C ディレクトリにアプリを登録します。 アプリを登録すると、アプリと Azure AD B2C の間に信頼関係が確立されます。

アプリの登録時に、リダイレクト URI を指定します。 リダイレクト URI は、ユーザーが Azure AD B2C で認証を行った後、Azure AD B2C によってリダイレクトされるエンドポイントです。 アプリの登録プロセスによって、アプリを一意に識別する "アプリケーション ID" ("クライアント ID" とも呼ばれます) が生成されます。 アプリが登録されると、Azure AD B2C はアプリケーション ID とリダイレクト URI の両方を使用して認証要求を作成します。

手順 2.1: アプリを登録する

Web アプリの登録を作成するには、次の手順に従います。

  1. Azure portal にサインインします。

  2. ご自分の Azure AD B2C テナントが含まれるディレクトリを必ず使用してください。 ポータル ツールバーの [Directories + subscriptions](ディレクトリ + サブスクリプション) アイコンを選択します。

  3. [ポータルの設定] | [Directories + subscriptions](ディレクトリ + サブスクリプション) ページの [ディレクトリ名] の一覧で自分の Azure AD B2C ディレクトリを見つけて、 [切り替え] を選択します。

  4. Azure portal で、 [Azure AD B2C] を検索して選択します。

  5. [アプリの登録] を選択し、 [新規登録] を選択します。

  6. [名前] で、アプリケーションの名前を入力します (webapp1 など)。

  7. [サポートされているアカウントの種類] で、 [Accounts in any identity provider or organizational directory (for authenticating users with user flows)]((ユーザー フローを使用してユーザーを認証するための) 任意の ID プロバイダーまたは組織のディレクトリのアカウント) を選択します。

  8. [リダイレクト URI] で、 [Web] を選択し、URL ボックスに「http://localhost:5000/getAToken」と入力します。

  9. [アクセス許可] で、 [Grant admin consent to openid and offline access permissions](OpenID とオフラインのアクセス許可に管理者の同意を与える) チェック ボックスをオンにします。

  10. [登録] を選択します。

  11. [概要] を選択します。

  12. アプリケーション (クライアント) ID を記録しておきます。これは、後で Web アプリケーションを構成するときに使用します。

    Screenshot of the web app Overview page for recording your web app I D.

手順 2.2: Web アプリのクライアント シークレットを作成する

登録済み Web アプリケーションに対してクライアント シークレットを作成します。 Web アプリケーションでは、トークンを要求するときに、このクライアント シークレットを使ってその ID を証明します。

  1. [管理] で、[証明書とシークレット] を選択します。
  2. [新しいクライアント シークレット] を選択します。
  3. [説明] ボックスにクライアント シークレットの説明を入力します (例、clientsecret1)。
  4. [有効期限] で、シークレットが有効な期間を選択してから、 [追加] を選択します。
  5. シークレットのを記録します。 この値は、後の手順での構成に使用します。

手順 3: Web アプリのサンプルを取得する

ZIP ファイルをダウンロードするか、GitHub からサンプル Web アプリケーションをクローンします。

git clone https://github.com/Azure-Samples/ms-identity-python-webapp.git

パスの合計文字長が 260 以下のフォルダーにサンプル ファイルを展開します。

手順 4: サンプル Web アプリを構成する

プロジェクトのルート ディレクトリで、次の手順に従います。

  1. app_config.py ファイルの名前を app_config.py.OLD に変更します。
  2. app_config_b2c.py ファイルの名前を app_config.py に変更します。

app_config.py ファイルを開きます。 このファイルには、Azure AD B2C ID プロバイダーに関する情報が含まれています。 次のアプリ設定のプロパティを更新します。

キー
b2c_tenant Azure AD B2C テナント名の最初の部分 (例: contoso)。
CLIENT_ID 手順 2.1 の Web API アプリケーション ID。
CLIENT_SECRET 手順 2.2 で作成したクライアント シークレット値。 実際には、コメントでも推奨されているように、セキュリティ強化の観点から、この値は環境変数に格納することを検討してください。
*_user_flow ユーザー フロー、または手順 1 で作成したカスタム ポリシー。

最終的な構成ファイルは、次の Python コードのようになります。

import os

b2c_tenant = "contoso"
signupsignin_user_flow = "B2C_1_signupsignin"
editprofile_user_flow = "B2C_1_profileediting"
resetpassword_user_flow = "B2C_1_passwordreset"
authority_template = "https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{user_flow}"

CLIENT_ID = "11111111-1111-1111-1111-111111111111" # Application (client) ID of app registration

CLIENT_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxx" # Placeholder - for use ONLY during testing.

重要

コード スニペットのコメントにも注意書きがあるように、アプリケーション コードでは、"シークレットをプレーンテキストに格納することは避けて" ください。 コード サンプルでは変数をハードコーディングしていますが、これは "あくまで便宜上" の措置です。 環境変数を使用するか、Azure キー コンテナーのようなシークレット ストアを使用することを検討してください。

手順 5: サンプル Web アプリを実行する

  1. コンソールまたはターミナルから、サンプルが格納されているディレクトリに切り替えます。 次に例を示します。

    cd ms-identity-python-webapp
    
  2. 次のコマンドを実行して、PyPi から必要なパッケージをインストールし、ローカル コンピューターで Web アプリを実行します。

    python -m pip install -r requirements.txt
    python -m flask run --host localhost --port 5000
    

    コンソール ウィンドウには、ローカルで稼働中のアプリケーションのポート番号が表示されます。

     * Serving Flask app "app" (lazy loading)
     * Environment: production
       WARNING: This is a development server. Do not use it in a production deployment.
       Use a production WSGI server instead.
     * Debug mode: off
     * Running on `http://localhost:5000/` (Press CTRL+C to quit)
    
  3. ローカル コンピューターで実行されている Web アプリケーションを表示するために、http://localhost:5000 に移動します。

  4. [サインイン] を選択します。

    Screenshot showing the sign-in flow.

  5. サインインアップまたはサインイン プロセスを完了します。

  6. 認証が成功すると、自分の表示名が次のように表示されます。

    Screenshot showing the web app token's display name claim.

ステップ 6: Web API を呼び出す

アプリで Azure AD B2C を使用してサインインし、Web API を呼び出せるようにするには、Azure AD B2C ディレクトリに 2 つのアプリケーションを登録する必要があります。

  • 手順 2. で既に作成した Web アプリケーション (Python) 登録。 このアプリ登録により、Azure AD B2C を使用したアプリのサインインが可能となります。 アプリの登録プロセスによって、アプリを一意に識別する "アプリケーション ID" ("クライアント ID" とも呼ばれます) が生成されます。 たとえば、アプリ ID: 1 などです。

  • Web API を登録すると、保護された Web API をアプリで呼び出すことができます。 この登録により、Web API のアクセス許可 (スコープ) が公開されます。 アプリの登録プロセスによって、Web API を一意に識別する "アプリケーション ID" が生成されます (たとえば "アプリ ID: 2")。 アプリ (アプリ ID: 1) のアクセス許可を Web API スコープ (アプリ ID: 2) に付与します。

次の図で、アプリの登録とアプリケーション アーキテクチャについて説明しています。

Diagram describing a web app with web A P I, registrations, and tokens.

認証が完了した後、ユーザーがアプリと対話すると、保護された Web API が呼び出されます。 その Web API では、ベアラー トークン認証が使用されます。 ベアラー トークンは、アプリによって Azure AD B2C から取得されたアクセス トークンです。 アプリでは、HTTPS 要求の Authorization ヘッダーでトークンを渡します。

Authorization: Bearer <token>

アクセス トークンのスコープが Web API のスコープと一致しない場合、認証ライブラリでは正しいスコープの新しいアクセス トークンが取得されます。

手順 6.1: Web API アプリを登録する

Web API アプリの登録 (App ID: 2) を作成するには、次の手順に従います。

  1. Azure portal にサインインします。

  2. ご自分の Azure AD B2C テナントが含まれるディレクトリを必ず使用してください。 ポータル ツールバーの [Directories + subscriptions](ディレクトリ + サブスクリプション) アイコンを選択します。

  3. [ポータルの設定] | [Directories + subscriptions](ディレクトリ + サブスクリプション) ページの [ディレクトリ名] の一覧で自分の Azure AD B2C ディレクトリを見つけて、 [切り替え] を選択します。

  4. Azure portal で、 [Azure AD B2C] を検索して選択します。

  5. [アプリの登録] を選択し、 [新規登録] を選択します。

  6. アプリケーションの名前を入力します (my-api1 など)。 [リダイレクト URI][サポートされているアカウントの種類] を既定値のままにします。

  7. [登録] を選択します。

  8. アプリ登録が完了したら、 [概要] を選択します。

  9. アプリケーション (クライアント) ID の値を記録しておきます。これは、後で Web アプリケーションを構成するときに使用します。

    Screenshot that demonstrates how to get a web A P I application I D.

手順 6.2: スコープを構成する

  1. 作成した my-api1 アプリケーション (App ID: 2) を選択して、その [概要] ページを開きます。

  2. [管理][API の公開] を選択します。

  3. [アプリケーション ID URI] の横にある [設定] リンクを選択します。 既定値 (GUID) を一意の名前 (例: tasks-api) に置き換え、[保存] を選択します。

    Web アプリケーションで Web API のアクセス トークンを要求するときに、API に対して定義する各スコープのプレフィックスとしてこの URI を追加する必要があります。

  4. [この API で定義されるスコープ] で、 [スコープの追加] を選択します。

  5. API への読み取りアクセスを定義するスコープを作成するには:

    1. [スコープ名]tasks.read を入力します。
    2. [管理者の同意の表示名] で、「Read access to tasks API」を入力します。
    3. [管理者の同意の説明] で、「Allows read access to the tasks API」を入力します。
  6. [スコープの追加] を選択します。

  7. [Add a scope (スコープの追加)] を選択し、API への書き込みアクセスを定義するスコープを追加します。

    1. [スコープ名] に「tasks.write」を入力します。
    2. [管理者の同意の表示名] に、「Write access to tasks API」を入力します。
    3. [管理者の同意の説明] に、「Allows write access to the tasks API」を入力します。
  8. [スコープの追加] を選択します。

手順 6.3: Web アプリにアクセス許可を付与する

アプリ (アプリ ID: 1) にアクセス許可を付与するには、次の手順をおこないます。

  1. [アプリの登録] を選択し、作成したアプリを選択します (アプリ ID: 1)。

  2. [管理] の下にある [API のアクセス許可] を選択します。

  3. [構成されたアクセス許可] の下で [アクセス許可の追加] を選択します。

  4. [自分の API] タブを選択します。

  5. Web アプリケーションへのアクセス許可が必要な API を選択します (アプリ ID: 2)。 たとえば、「my-api1」と入力します。

  6. [アクセス許可] で、 [タスク] を展開し、前に定義したスコープを選択します(たとえば、tasks.readtasks.write)。

  7. [アクセス許可の追加] を選択します.

  8. [<テナント名> に管理者の同意を与えます] を選択します。

  9. [はい] を選択します。

  10. [最新の情報に更新] を選択し、両方のスコープの [状態] に、Granted for ...(... に付与されました) と表示されていることを確認します。

  11. [Configured permissions (構成済みのアクセス許可)] の一覧からスコープを選択し、スコープの完全な名前をコピーします。

    Screenshot of the configured permissions pane, showing that read access permissions are granted.

手順 6.4: Web API を構成する

このサンプルでは、Web アプリが Web API に対して使用できる、適切なスコープを含んだアクセス トークンを取得します。 Web API をコードから呼び出す場合は、既存の Web API を使用するか、新しい Web API を作成します。 詳細については、「Azure AD B2C を使用して独自の Web API で認証を有効にする」を参照してください。

手順 6.5: Web API を使用してサンプル アプリを構成する

app_config.py ファイルを開きます。 このファイルには、Azure AD B2C ID プロバイダーに関する情報が含まれています。 アプリ設定の次のプロパティを更新します。

Key
ENDPOINT Web API の URI (例: https://localhost:44332/hello)。
SCOPE 作成済みの Web API スコープ

最終的な構成ファイルは、次の Python コードのようになります。

import os

b2c_tenant = "contoso"
signupsignin_user_flow = "B2C_1_signupsignin"
editprofile_user_flow = "B2C_1_profileediting"
resetpassword_user_flow = "B2C_1_passwordreset"
authority_template = "https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{user_flow}"

CLIENT_ID = "11111111-1111-1111-1111-111111111111" # Application (client) ID of app registration

CLIENT_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxx" # Placeholder - for use ONLY during testing.

### More code here

# This is the API resource endpoint
ENDPOINT = 'https://localhost:44332' 


SCOPE = ["https://contoso.onmicrosoft.com/api/demo.read", "https://contoso.onmicrosoft.com/api/demo.write"] 

手順 6.6: サンプル アプリを実行する

  1. コンソールまたはターミナルから、サンプルが格納されているディレクトリに切り替えます。

  2. アプリを停止します。 その後、再実行します。

  3. [Call Microsoft Graph API](Microsoft Graph API の呼び出し) を選択します。

    Screenshot showing how to call a web A P I.

手順 7: アプリケーションをデプロイする

運用アプリケーションでは、アプリ登録のリダイレクト URI は通常、アプリが実行されているパブリックにアクセス可能なエンドポイント (https://contoso.com/getAToken など) です。

お使いの登録済みアプリケーションでは、いつでもリダイレクト URI を追加したり、変更したりすることができます。 リダイレクト URI には、次の制限があります。

  • 応答 URL は、スキーム https で始まる必要があります。
  • 応答 URL では大文字と小文字が区別されます。 大文字と小文字の区別は、実行中のアプリケーションの URL パスの場合と一致している必要があります。

次のステップ