PythonのMicrosoft Authentication Library (MSAL)

Python 用 Microsoft Authentication Library (MSAL) を使用すると、Microsoft ID(Microsoft Entra IDMicrosoft アカウント、および Microsoft Entra ID アカウント)を使用して、ユーザーまたはアプリをサインインさせることができます。 MSAL Pythonを使用すると、Microsoft Entra IDからトークンを取得して、Microsoft Graph、他のMicrosoft API、独自の API などの保護された Web API を呼び出すことができます。

Prerequisites

パッケージをインストールする

Python パッケージの MSAL をインストールします。 PyPI で MSAL Pythonを見つけることができます。

pip install msal

ID の概念

MSAL Pythonは、Microsoft ID プラットフォーム エコシステムの一部です。 MSAL Pythonを効果的に使用してアプリケーションと API を保護するには、次の概念を理解してください。

使用シナリオ

MSAL Pythonを使用するには、アプリケーションをMicrosoft ID プラットフォームに登録します。 アクティブなサブスクリプションを持つAzure アカウントが必要です。 無料アカウント がない場合は作成します。 顧客テナントまたは従業員テナントにアプリを登録できます。

アプリケーションでは、MSAL Pythonを使用して、保護された API にアクセスするためのトークンを取得できます。 アプリの種類が異なると、異なる認証フローを使用してトークンが取得されます。 サポートされているアプリの種類には、デスクトップ アプリケーション、Web アプリケーション、Web API、ブラウザーのないデバイス (IoT デバイスなど) で実行されているアプリケーションが含まれます。

MSAL Pythonでは、アプリケーションは次のように分類されます。

詳細については、パブリック クライアント アプリと機密クライアント アプリに関するドキュメントと、Microsoft ID プラットフォームのさまざまなアプリの種類とその認証フローを参照してください。

アプリケーションがパブリック クライアント アプリケーションか機密クライアント アプリケーションかを判断したら、MSAL Pythonを使用して、さまざまなシナリオのトークンを取得できます。

基本的な使用方法

MSAL Pythonを使用してトークンを取得するには、3 段階のパターンに従います。 フローごとにいくつかのバリエーションがあります。 実際の動作を確認したい場合は、 サンプルをダウンロードしてください。

  1. MSAL は、パブリック クライアント アプリケーションと機密クライアント アプリケーションの間のクリーンな分離に依存します。 そのため、 PublicClientApplication または ConfidentialClientApplication インスタンスを作成し、アプリケーションのライフサイクル中に再利用します。 たとえば、パブリック クライアント アプリケーションの場合、初期化コードは次のようになります。

    from msal import PublicClientApplication
    
    app = PublicClientApplication(
        "your_client_id",
        authority="https://login.microsoftonline.com/common")
    

    機関の値は、サインインするアカウントの種類と、アプリが登録されているテナントの種類によって異なります。 たとえば、従業員テナント (Microsoft Entra ID) でプロビジョニングされた職場アカウントと個人用Microsoft アカウントの両方にサインインするには、https://login.microsoftonline.com/commonを使用します。 顧客テナント内でプロビジョニングされた顧客アカウントでは、権限は https://<subdomain>.ciamlogin.com のような形式になります。 詳細については、 トークン発行者のドキュメントを参照してください

  2. 最初にキャッシュからトークンを取得してみてください。 MSAL の API モデルでは、トークン キャッシュを利用する方法を明示的に制御できます。 キャッシュ部分は技術的には省略可能ですが、アプリケーションで使用することを強くお勧めします。 キャッシュを使用すると、追加の API 呼び出しを行わず、トークンの更新を自動的に処理することができます。

    # initialize result variable to hole the token response
    result = None 
    
    # We now check the cache to see
    # whether we already have some accounts that the end user already used to sign in before.
    accounts = app.get_accounts()
    if accounts:
        # If so, you could then somehow display these accounts and let end user choose
        print("Pick the account you want to use to proceed:")
        for a in accounts:
            print(a["username"])
        # Assuming the end user chose this one
        chosen = accounts[0]
        # Now let's try to find a token in cache for this account
        result = app.acquire_token_silent(["User.Read"], account=chosen)
    
  3. キャッシュに適切なトークンがない場合、または前の手順をスキップすることを選択した場合は、トークンを取得するためにMicrosoft Entra IDに要求を送信します。 クライアントの種類とシナリオに応じてさまざまな方法がありますが、この例では、 acquire_token_interactiveを使用する方法を示しています。この方法では、ユーザーに資格情報の入力を求めます。

    if not result:
        # So no suitable token exists in cache. Let's get a new one from Azure AD.
        result = app.acquire_token_interactive(scopes=["User.Read"])
    if "access_token" in result:
        print(result["access_token"])  # Yay!
    else:
        print(result.get("error"))
        print(result.get("error_description"))
        print(result.get("correlation_id"))  # You may need this when reporting a bug
    
  4. コードを msaltest.py などのPython ファイルにローカルに保存します。

  5. python .\msalpytest.pyを実行してコードを実行します。 次のビジュアルは、この例のサインイン エクスペリエンスを示しています。

    ユーザーが自分のアカウントでサインインするように求めるアプリの例

  6. 認証が完了し、ブラウザーを閉じると、ターミナルに出力されたアクセス トークンを確認できるようになります。

堅牢なエンタープライズ対応アプリケーションのベスト プラクティス

MSAL Pythonを使用して、保護された Web API のトークンを取得できます。 また、更新トークンを自分で処理する必要はありません。 ただし、堅牢でエンタープライズ対応のアプリケーションを構築するには、もう少し行う必要があります。 たとえば、次の手順を実行します。

  • トークンを取得する場合と、保護された Web API を呼び出すときの両方で、例外を処理します。 特に、テナント管理者が Multi Factor Authentication (MFA) を適用するように条件付きアクセス ポリシーを設定しているMicrosoft Entra テナントでアプリケーションを実行する場合は、要求チャレンジを処理する必要があります。

  • ログ 記録 を有効にして、ユーザーのプライバシーを尊重し、GDPR に準拠しながら、アプリケーションのトラブルシューティングを行い、ユーザーを支援することができます。

Samples

MSAL Pythonの使用を開始するために使用できるサンプルがいくつかあります。

References

こちらも参照ください