如果您在 Azure AD 租户中启用了 MFA,则无法使用UsernamePasswordCredential
or 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)
输出: