如果要生成Windows应用程序,可以考虑简化用户使用身份验证代理进行身份验证的方式。 Web 帐户管理器(WAM)是一个与 MSAL Python配合使用的身份验证代理。 WAM 仅适用于Windows 10及更高版本,以及Windows Server 2019及更高版本。
有关使用身份验证代理的好处的详细信息,请参阅 MSAL.NET 文档中的代理。
Usage
若要使用中转站,除了 PyPI 中的核心 MSAL 之外,还需要安装与中转站相关的包:
pip install msal[broker]>=1.20,<2
如果未安装中转站相关包并尝试使用身份验证代理,则会收到错误 ImportError:需要通过:pip 安装“msal[broker]>=1.20,2<”来安装依赖项。
接下来,实例化一个新的 PublicClientApplication,并将 enable_broker_on_windows 设置为 True。 这将确保 MSAL 将尝试与 WAM 通信,而不是弹出新的浏览器窗口。 如果要编写跨平台应用程序,则还需要使用enable_broker_on_mac,如在 macOS 上的身份验证代理中使用 MSAL Python中所述。
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 门户中配置正确的重定向 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 中注册该帐户,则提示将自动填写“ 电子邮件”或“电话 ”字段。