快速入门:使用应用的标识获取令牌并从 Python 控制台应用中调用 Microsoft Graph API

欢迎使用! 这可能不是你期望看到的页面。 在修复时,此链接应会将你转至正确的文章:

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

对此造成你的不便,我们深表歉意;感谢你的耐心等待,我们正在努力解决此问题。

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

先决条件

若要运行此示例,需要:

下载并配置快速入门应用

步骤 1:在 Azure 门户中配置应用程序

为使本快速入门的代码示例正常运行,请创建客户端机密,并添加图形 API 的 User.Read.All 应用程序权限。

Already configured 应用程序已使用这些属性进行配置。

步骤 2:下载 Python 项目

注意

Enter_the_Supported_Account_Info_Here

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

全局租户管理员

如果你是全局管理员,请转到“API 权限”页面,选择“为 Enter_the_Tenant_Name_Here 授予管理员同意”。

标准用户

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

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

步骤 4:运行应用程序

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

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"] 是在 Azure 门户中为应用程序创建的客户端机密。
config["client_id"] 是在 Azure 门户中注册的应用程序的应用程序(客户端) ID。 可以在 Azure 门户的应用的“概览”页中找到此值。
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 Azure AD.")
    result = app.acquire_token_for_client(scopes=config["scope"])
其中: 说明
config["scope"] 包含请求的范围。 对于机密客户端,这应该使用与 {Application ID URI}/.default 类似的格式,指示所请求的范围是在 Azure 门户的应用对象集中静态定义的范围(就 Microsoft Graph 来说,{Application ID URI} 指向 https://microsoftgraph.chinacloudapi.cn)。 对于自定义 Web API,{Application ID URI} 是在 Azure 门户的“应用注册”的“公开 API”部分中定义的 。

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

帮助和支持

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

后续步骤

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