Windows アプリケーションを構築する場合は、認証ブローカーを使用してユーザーの認証方法を簡略化することを検討してください。 Web アカウント マネージャー (WAM) は、MSAL Pythonで動作する認証ブローカーです。 WAM は、Windows 10 以降、およびWindows Server 2019以上でのみ使用できます。
認証ブローカーを使用する利点の詳細については、MSAL.NET ドキュメントのブローカーとはを参照してください。
使用方法
ブローカーを使用するには、PyPI のコア MSAL に加えて、ブローカー関連のパッケージをインストールする必要があります。
pip install msal[broker]>=1.20,<2
ブローカー関連のパッケージがインストールされておらず、認証ブローカーを使用しようとすると、ImportError というエラーが表示されます。 依存関係をインストールするには、pip install "msal[broker]>=1.20,<2" をインストールする必要があります。
次に、新しい PublicClientApplication をインスタンス化し、 enable_broker_on_windows を True に設定します。 これにより、MSAL は新しいブラウザー ウィンドウをポップアップするのではなく、WAM と通信しようとします。 クロスプラットフォーム アプリケーションを作成する場合は、enable_broker_on_macに関する記事で説明されているように、も使用する必要があります。
from msal import PublicClientApplication
app = PublicClientApplication(
"CLIENT_ID",
authority="https://login.microsoftonline.com/common",
enable_broker_on_windows=True)
acquire_token_interactiveを呼び出し、parent_window_handleを使用して親ウィンドウ ハンドルを指定することで、トークンを取得できるようになりました。
result = app.acquire_token_interactive(["User.ReadBasic.All"],
parent_window_handle=app.CONSOLE_WINDOW_HANDLE)
要求ウィンドウの上にダイアログが正しく表示されるようにするには、WAM によって親ウィンドウ ハンドルが必要です。 MSAL では、WAM がどのウィンドウにバインドする必要があるかに影響を与える可能性がある変数が多数存在し、アプリケーションを構築する開発者は、どのウィンドウを作成する必要があるかを決定するのに最適であるため、これを直接推測しません。
コンソール アプリケーションの場合、MSAL を使用すると、すぐに使用できるソリューションを提供して、ターミナルのウィンドウ ハンドル ( CONSOLE_WINDOW_HANDLE) を取得できます。 デスクトップ アプリケーションの場合、ウィンドウ ハンドルを取得するために、Windows API を使用する作業が増える必要がある場合があります。
pywin32 などのヘルパー パッケージは、API 呼び出しに役立ちます。
アプリケーションを実行する前に、デスクトップ アプリのリダイレクト URL を構成していることを確認します。
Windows ブローカーを使用するには、アプリケーションで、Azure portalで正しいリダイレクト URL を次の形式で構成する必要があります。
ms-appx-web://microsoft.aad.brokerplugin/YOUR_CLIENT_ID
リダイレクト URL が構成されていない場合は、(pii) のようなbroker_errorが表示されます。状態: Response_Status.Status_ApiContractViolation、エラー コード: 3399614473、タグ: 557973642。
構成とインスタンス化が正しい場合は、アプリケーションを実行すると、認証ブローカーが開始され、ユーザーが認証するアカウントを選択できるようになります。
ブローカーベースの認証を使用するように切り替えた場合、ユーザーが以前にログインしていて、サインイン状態がまだ有効な場合、 acquire_token_interactive を呼び出してもトークンの取得がサイレント試行され、必要な場合にのみプロンプトが表示されることに注目してください。 常にプロンプトを表示する場合は、この省略可能なパラメーター prompt="select_account"を使用できます。
ブローカー エクスペリエンスの違い
PublicClientApplicationのインスタンス化時に指定された権限に応じて、ブローカーのユーザー インターフェイスが異なる場合があります。
/消費者
個人のMicrosoft アカウントでのみ認証するために使用されます。
/共通
個人のMicrosoft アカウントおよび職場および学校アカウントでの認証に使用されます。
/組織
職場および学校アカウント でのみ 認証するために使用されます。
login_hintが指定されていても、アカウントがまだ WAM に登録されていない場合、ヒントは自動的に [電子メール] または [電話] フィールドに入力されます。
/TENANT_ID
指定したテナント内の職場および学校アカウント でのみ 認証するために使用されます。
login_hintが指定されていても、アカウントがまだ WAM に登録されていない場合、ヒントは自動的に [電子メール] または [電話] フィールドに入力されます。