快速入门:获取令牌并从 Python 守护程序应用中调用 Microsoft Graph

在本快速入门中,你将下载并运行一个代码示例,该示例演示 Python 应用程序如何使用应用的标识获取访问令牌以调用 Microsoft Graph API 并在目录中显示用户列表。 代码示例演示无人参与的作业或 Windows 服务如何使用应用程序标识而不是用户标识运行。

Diagram showing how the sample app generated by this quickstart works.

先决条件

若要运行此示例,需要:

注册并下载快速入门应用

步骤 1:注册应用程序

提示

本文中的步骤可能因开始使用的门户而略有不同。

若要手动注册应用程序并将应用的注册信息添加到解决方案,请执行以下步骤:

  1. 登录 Microsoft Entra 管理中心
  2. 如果你有权访问多个租户,请使用顶部菜单中的“设置”图标 ,通过“目录 + 订阅”菜单切换到你希望在其中注册应用程序的租户。
  3. 浏览至“标识”>“应用程序”>“应用注册”,然后选择“新建注册”。
  4. 输入应用程序的名称(例如 Daemon-console)。 应用的用户可能会看到此名称,你稍后可对其进行更改。
  5. 选择“注册” 。
  6. 在“管理”下,选择“证书和机密”
  7. 在“客户端机密”下,选择“新建客户端机密”,输入名称,然后选择“添加” 。 将机密值记录在安全的位置,以供在后面的步骤中使用。
  8. 在“管理”下,选择“API 权限”>“添加权限” 。 选择“Microsoft Graph”。
  9. 选择“应用程序权限”。
  10. 在“用户”节点下选择“User.Read.All”,然后选择“添加权限” 。

步骤 2:下载 Python 项目

下载 Python 守护程序项目

步骤 3:配置 Python 项目

  1. 将 zip 文件提取到靠近磁盘根目录的本地文件夹,例如 C:\Azure-Samples

  2. 导航到子文件夹“1-Call-MsGraph-WithSecret”。

  3. 编辑 parameters.json,将字段 authorityclient_idsecret 的值替换为以下代码片段:

    "authority": "https://login.partner.microsoftonline.cn/Enter_the_Tenant_Id_Here",
    "client_id": "Enter_the_Application_Id_Here",
    "secret": "Enter_the_Client_Secret_Here"
    

    其中:

    • Enter_the_Application_Id_Here - 是已注册应用程序的应用程序(客户端)ID
    • Enter_the_Tenant_Id_Here - 将此值替换为租户 ID租户名称(例如 contoso.microsoft.com)
    • Enter_the_Client_Secret_Here - 将此值替换为在步骤 1 中创建的客户端机密。

提示

要查找“应用程序(客户端)ID”和“目录(租户)ID”的值,请转到 Microsoft Entra 管理中心中应用的“概述”页。 若要生成新密钥,请转到“证书和机密”页。

如果尝试在此时运行应用程序,则会收到“HTTP 403 - 禁止访问”错误:Insufficient privileges to complete the operation。 之所以出现这种错误,是因为任何仅限应用的权限都需要管理员同意:目录的全局管理员必须为应用程序授予同意。 根据自己的角色选择下面的一个选项:

全局租户管理员

如果你是全局租户管理员,请在 Microsoft Entra 管理中心中转到“应用注册”中的“API 权限”页面,然后选择“为 {租户名称} 授予管理员同意”(其中,{租户名称} 是目录的名称)。

标准用户

如果你是租户的标准用户,则请求全局管理员为你的应用程序授予管理员许可。 为此,请将以下 URL 提供给管理员:

https://login.partner.microsoftonline.cn/Enter_the_Tenant_Id_Here/adminconsent?client_id=Enter_the_Application_Id_Here

其中:

  • Enter_the_Tenant_Id_Here - 将此值替换为租户 ID租户名称(例如 contoso.microsoft.com)
  • Enter_the_Application_Id_Here - 是之前注册的应用程序的应用程序(客户端)ID

步骤 5:运行应用程序

需要安装一次此示例的依赖项。

pip install -r requirements.txt

然后,通过命令提示符或控制台运行应用程序:

python confidential_client_secret_sample.py parameters.json

应该会在控制台输出上看到一些 JSON 片段,表示 Microsoft Entra 目录中的用户列表。

重要

本快速入门应用程序使用客户端机密将自己标识为机密客户端。 由于客户端机密是以纯文本形式添加到项目文件的,因此为了安全起见,建议在考虑将应用程序用作生产应用程序之前,使用证书来代替客户端机密。 若要详细了解如何使用证书,请参阅有关此示例的这些说明它与本示例位于同一 GitHub 存储库中,但在另一个文件夹“2-Call-MsGraph-WithCertificate”中。

详细信息

MSAL Python

MSAL Python 是用于实现用户和(用于访问受 Microsoft 标识平台保护的 API 的)请求令牌登录的库。 如前所述,本快速入门请求令牌的方法是使用应用程序自身的标识而不是委托的权限。 在此示例中使用的身份验证流称为客户端凭据 oauth 流。 若要详细了解如何搭配使用 MSAL Python 和守护程序应用,请参阅本文

运行以下 PIP 命令即可安装 MSAL Python。

pip install msal

MSAL 初始化

可以通过添加以下代码,为 MSAL 添加引用:

import msal

然后,使用以下代码对 MSAL 进行初始化:

app = msal.ConfidentialClientApplication(
    config["client_id"], authority=config["authority"],
    client_credential=config["secret"])
其中: 说明
config["secret"] 是在 Microsoft Entra 管理中心中为应用程序创建的客户端密码。
config["client_id"] 是在 Microsoft Entra 管理中心中注册的应用程序(客户端)ID。 可以在 Microsoft Entra 管理中心中应用的“概述”页上找到此值。
config["authority"] 用户要进行身份验证的 STS 终结点。 对于公有云,通常为 https://login.partner.microsoftonline.cn/{tenant},其中 {tenant} 是租户名称或租户 ID。

有关详细信息,请参阅 ConfidentialClientApplication 的参考文档

请求令牌

若要通过应用的标识来请求令牌,请使用 AcquireTokenForClient 方法:

result = None
result = app.acquire_token_silent(config["scope"], account=None)

if not result:
    logging.info("No suitable token exists in cache. Let's get a new one from AAD.")
    result = app.acquire_token_for_client(scopes=config["scope"])
其中: 说明
config["scope"] 包含请求的范围。 对于机密客户端,这应该使用与 {Application ID URI}/.default 类似的格式,以指示所请求的范围是在 Microsoft Entra 管理中心的应用对象集中静态定义的范围(对于 Microsoft Graph,{Application ID URI} 指向 https://microsoftgraph.chinacloudapi.cn)。 对于自定义 Web API,{Application ID URI} 是在 Microsoft Entra 管理中心的“应用注册”的“公开 API”部分下定义的。

有关详细信息,请参阅 AcquireTokenForClient 的参考文档

帮助和支持

如果需要帮助、需要报告问题,或者需要详细了解支持选项,请参阅面向开发人员的帮助和支持

后续步骤

若要详细了解守护程序应用程序,请参阅方案登陆页面。