用于Python的 Microsoft 身份验证库 (MSAL)

适用于 Python 的 Microsoft 身份验证库 (MSAL) 库使你能够让用户或应用使用 Microsoft 标识(Microsoft Entra IDMicrosoft 帐户Microsoft Entra ID帐户)登录。 使用 MSAL Python,可以从Microsoft Entra ID获取令牌,以调用受保护的 Web API,例如Microsoft Graph、其他Microsoft API 或自己的 API。

先决条件

安装软件包

安装 msAL for Python 包。 可以在 PyPI 上找到 MSAL Python。

pip install msal

标识概念

MSAL Python是Microsoft 标识平台生态系统的一部分。 熟悉以下概念,以有效使用 MSAL Python来保护应用程序和 API:

使用场景

若要使用 MSAL Python,请向Microsoft 标识平台注册应用程序。 需要一个具有活动订阅的Azure帐户。 如果没有帐户,请创建一个免费帐户。 可以在 客户租户员工租户中注册应用。

应用程序可以使用 MSAL Python获取用于访问受保护 API 的令牌。 不同的应用类型使用不同的身份验证流获取令牌。 支持的应用类型包括桌面应用程序、Web 应用程序、Web API 和在没有浏览器的设备(如 IoT 设备)上运行的应用程序。

在 MSAL Python中,应用程序分类如下:

  • 公共客户端应用程序 (桌面和移动设备)。 这些类型的应用无法安全地存储应用机密。
  • 机密客户端应用程序 (Web 应用、Web API 和守护程序应用程序)。 这些类型的应用安全地存储注册Microsoft Entra ID的机密。

有关详细信息,请参阅有关公共客户端和机密客户端应用的文档以及Microsoft 标识平台中的不同应用类型及其身份验证流

确定应用程序是公共还是机密客户端应用程序后,可以使用 MSAL Python获取不同方案的令牌。

基本用法

使用 MSAL Python获取令牌遵循三步模式。 对于不同的流,会有一些变化。 如果您想了解其实际效果,请下载我们的 示例

  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. 将代码保存到本地Python文件中,例如 msaltest.py

  5. 通过执行 python .\msalpytest.py来运行代码。 以下视觉对象显示了此示例的登录体验。

    提示用户使用其帐户登录的应用示例

  6. 完成身份验证并关闭浏览器后,应能够看到终端中打印的访问令牌。

构建稳健的企业级应用程序的最佳实践

可以使用 MSAL Python获取受保护 Web API 的令牌。 你也无需自己处理刷新令牌。 但是,若要生成可靠的企业就绪应用程序,需要执行更多操作。 例如,您可能需要:

  • 处理异常:无论是在获取令牌时,还是在调用受保护的 Web API 时,都要这样做。 具体而言,如果应用程序在租户管理员已设置条件访问策略以强制实施多重身份验证(MFA)的Microsoft Entra租户中运行,则需要处理声明质询。

  • 你可能希望启用 日志记录 来对应用程序进行故障排除并帮助用户,同时尊重其隐私并符合 GDPR。

Samples

可以使用多个示例开始使用 MSAL Python。

  • 来自库仓库的示例。 这些示例演示了使用 MSAL Python实现的不同配置和身份验证流。
  • 一个存储库, 其中包含文档中使用的示例。 这些示例提供支持文档,可帮助你从头开始生成和复制它们。

References

  • GitHub 上的 MSAL Python 库存储库
  • MSAL Python 在 GitHub 上发布。

另见