0

我正在尝试通过msgraph-sdk-python-core库访问/meMS Graph API 中的端点。该请求通过 Graph Explorer 工作,但现在我想使用代码。我只是想复制他们在 README.md 中显示的完全相同的请求:

from azure.identity import InteractiveBrowserCredential
from msgraph.core import GraphClient

browser_credential = InteractiveBrowserCredential(client_id='YOUR_CLIENT_ID')
client = GraphClient(credential=browser_credential)
result = client.get('/me')

但是,InteractiveBrowserCredential我需要使用非交互式的东西,而不是使用 。azure-identity库包含例如 ,UsernamePasswordCredentialOnBehalfOfCredential,但我不确定应该使用哪个。

我尝试了几种不同的方法,这导致了不同的错误。根本问题最终可能是 IT 未在 Azure 中正确配置该应用程序。也许他们需要将应用程序激活为“公共客户端”或类似的。但是,在我要求 IT 继续在 Azure 中乱搞之前,我想确认一下我的代码应该是什么样子。

4

1 回答 1

0

如果您在 Azure AD 租户中启用了 MFA,则无法使用UsernamePasswordCredentialor OnBehalfOfCredential,您将不得不使用ClientSecretCredential非交互式方法,但您无法调用/me端点,因为您将使用已配置为使用的AzureAD 应用程序进行身份验证要调用 Graph API,您还需要在您的App Registration的 API 权限刀片中提供所需的权限,与您在 Graph Explorer 中提供的方式相同。

如果您没有启用 MFA,那么您可以使用这两种非交互式方法。


在此处输入图像描述

ClientSecretCredential:

我正在测试以获取所有用户的详细信息,因此我提供Directory.ReadWrite.All了上述应用程序并使用了以下代码:

from azure.identity import ClientSecretCredential
from msgraph.core import GraphClient


credential = ClientSecretCredential(tenant_id='e186e64a-xxxx-xxxx-xxxx-xxxx',client_secret='L~I7Qxxxxxxxxxxxxxxx',client_id='1be5d8ab-xxxx-xxxx-xxxx-xxxx')
client = GraphClient(credential=credential)
result = client.get('/users')
print(result.json())

输出:

在此处输入图像描述

注意:在这个方法/Me中不能调用,你会得到以下错误:

在此处输入图像描述


由于Azure 不推荐UsernamePassowrdCredential,因此您必须使用OnbehalfOfCredential。要在 Python 中为 OBO Flow 设置环境,您可以参考此Azure 示例

或者

您可以直接使用 Rest 从 python 调用 Graph API,如下所示:

import requests
import json
tenant_id='e186e64a-xxxxxxxxxxxxxxxxx'
client_secret='L~I7Q~xxxxxxxxxxxxxxxxxxxxxx'
client_id='1be5d8ab-1960-4508-93e4-b138b3295593'
username='admin@xxxxxxxxxxx.onmicrosoft.com'
password='xxxxxxxxxxx'
token_url = 'https://login.microsoftonline.com/<tenant_id>/oauth2/token'
token_data = {
 'grant_type': 'password',
 'client_id': client_id,
 'client_secret': client_secret,
 'resource': 'https://graph.microsoft.com',
 'scope':'https://graph.microsoft.com',
 'username':username, #Account with no 2MFA
 'password':password,
}
token_r = requests.post(token_url, data=token_data)
token = token_r.json().get('access_token')
# Use the token using microsoft graph endpoints
users_url = 'https://graph.microsoft.com/v1.0/me'
headers = {
 'Authorization': 'Bearer {}'.format(token)
}
user_response_data = json.loads(requests.get(users_url, headers=headers).text)
print(user_response_data) 

输出:

在此处输入图像描述

于 2021-12-21T09:36:44.683 回答