通过 msgraph-sdk-python-core 在 MS Graph API 中访问 /me
Accessing /me in MS Graph API via msgraph-sdk-python-core
我正在尝试通过 msgraph-sdk-python-core 库访问 MS Graph API 中的 /me
端点。该请求通过 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 库包含 UsernamePasswordCredential
、OnBehalfOfCredential
等,但我不确定应该使用哪个。
我尝试了几种不同的方法,导致了不同的错误。根本问题最终可能是 IT 未在 Azure 中正确配置该应用程序。也许他们需要将应用激活为“public 客户端”或类似应用。然而,在我要求 IT 继续在 Azure 中搞砸之前,我想确认我的代码应该是什么样子。
如果您在 Azure AD 租户中启用了 MFA,则您不能使用 UsernamePasswordCredential
或 OnBehalfOfCredential
,您必须使用 ClientSecretCredential
作为非交互方法,但您无法调用 /me
端点,因为您将使用您配置用于调用 Graph AzureAD 应用程序 进行身份验证 API 并且您还需要在 API 权限 Blade 中提供 所需的权限 应用程序注册,与您在 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 . To set up the environment for OBO Flow in Python you can refer this Azure Sample.
或
您可以直接使用 Rest 从 python 调用图 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)
输出:
我正在尝试通过 msgraph-sdk-python-core 库访问 MS Graph API 中的 /me
端点。该请求通过 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 库包含 UsernamePasswordCredential
、OnBehalfOfCredential
等,但我不确定应该使用哪个。
我尝试了几种不同的方法,导致了不同的错误。根本问题最终可能是 IT 未在 Azure 中正确配置该应用程序。也许他们需要将应用激活为“public 客户端”或类似应用。然而,在我要求 IT 继续在 Azure 中搞砸之前,我想确认我的代码应该是什么样子。
如果您在 Azure AD 租户中启用了 MFA,则您不能使用 UsernamePasswordCredential
或 OnBehalfOfCredential
,您必须使用 ClientSecretCredential
作为非交互方法,但您无法调用 /me
端点,因为您将使用您配置用于调用 Graph AzureAD 应用程序 进行身份验证 API 并且您还需要在 API 权限 Blade 中提供 所需的权限 应用程序注册,与您在 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 . To set up the environment for OBO Flow in Python you can refer this Azure Sample.
或
您可以直接使用 Rest 从 python 调用图 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)
输出: