我正在创建一个将使用 Microsoft Security Graph API 的 python 应用程序。我已关注the sample provided here没有问题。我现在希望能够创建一个 python 应用程序,无需使用 Web 浏览器即可获取访问 token (并在需要时刷新它)。
到目前为止,我已经在委派权限
下创建了一个具有SecurityEvent.Read.All
和SecurityEvent.ReadWrite.All
权限的新应用程序,并且应用程序权限
。然后,我在网络浏览器中访问以下网址以授予我的申请同意并使用我的租户管理员登录:
https://login.microsoftonline.com/common/adminconsent?
client_id=APPLICATION_ID
&state=12345
&redirect_uri=REDIRECT_URL
接下来,我想我想关注 the steps here进行 POST 调用来获取 token 。下面是我如何做到这一点的示例。
d = {
"client_id": <client_id>,
"scope": ["https://graph.microsoft.com/.default"],
"client_secret": <client_secret>,
"grant_type": "client_credentials"
}
r = requests.post("https://login.microsoftonline.com/common/oauth2/v2.0/token", data=d)
以下是我收到的回复
{
"token_type": "Bearer",
"expires_in": 3600,
"ext_expires_in": 0,
"access_token": "eyJ0eXAiOiJKV1QiLCJub25jZSI6IkFRQUJBQUFBQUFDNXVuYTBFVUZnVElGOEVsYXh0V2pUR2cxQV9PR0FJWmx3T1V0b2hMNHdWN2hURHVoQTJSTzIyQnY0cGljcGJ2UmkwdEdpcmY0Q2cxaDhRZF9RamUzX2l0LUhfT1VhTnJRaDFxYXpINWtIRENBQSIsImFsZyI6IlJTMjU2IiwieDV0IjoiaTZsR2szRlp6eFJjVWIyQzNuRVE3c3lISmxZIiwia2lkIjoiaTZsR2szRlp6eFJjVWIyQzNuRVE3c3lISmxZIn0.eyJhdWQiOiJodHRwczovL2dyYXBoLm1pY3Jvc29mdC5jb20iLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC83MmY5ODhiZi04NmYxLTQxYWYtOTFhYi0yZDdjZDAxMWRiNDcvIiwiaWF0IjoxNTQwNDE3MjI0LCJuYmYiOjE1NDA0MTcyMjQsImV4cCI6MTU0MDQyMTEyNCwiYWlvIjoiNDJSZ1lMRDUvK2RINkplbC9EK1RHRmZlaVNqMUJnQT0iLCJhcHBfZGlzcGxheW5hbWUiOiJTZWN1cml0eSBHcmFwaCBQT0MiLCJhcHBpZCI6IjMxMjA0MGRmLWIyZmUtNDI1Ni04ZWZkLTk1NDYyOTVjNWZhNyIsImFwcGlkYWNyIjoiMSIsImlkcCI6Imh0dHBzOi8vc3RzLndpbmRvd3MubmV0LzcyZjk4OGJmLTg2ZjEtNDFhZi05MWFiLTJkN2NkMDExZGI0Ny8iLCJ0aWQiOiI3MmY5ODhiZi04NmYxLTQxYWYtOTFhYi0yZDdjZDAxMWRiNDciLCJ1dGkiOiJnLUtlY1dkZXcwQzV2cjBoLUhGZ0FBIiwidmVyIjoiMS4wIiwieG1zX3RjZHQiOjEyODkyNDE1NDd9.JGu6fjJk_vVvG_4NYRBfZto6nW9YRWh43JzhrlcFqFYAnJSJvWDlHbzka_H3gUKkZernQanzjI6AumER9mOtapmj1qhu_58pCuL2lTl2ubj1MTBTYOpUX3hlKgN16AeyvjO1x95LKDO9xAcIYLXEmwbkNw87x7YxZ1lKBA59c1BCCILmqMf86E7CDExf7EPqbqAPdCI6FPkStx5CJ0YnvAN2Uk5EHloTL3BTXMqMmT05h7OAvZRogkIk4aeGof1OXKcqXw7dJbzYg8XiEeXdAYhA1ld6VEwiVBMSpqf4w476Ksvr8JUbg-xhAmGoU8CrXBB4em5Gv2ko89-qP49nUA"
}
使用现在获得的访问 token ,我尝试调用 /alerts
端点。以下是如何完成此操作。
headers = {
"Content-type": "application/json",
"Authorization": "Bearer " + <access_token>,
}
alerts = requests.get("https://graph.microsoft.com/v1.0/security/alerts", headers=headers)
在我看来,响应并不是返回警报:
{
"error": {
"code": "UnknownError",
"message": "Auth token does not contain valid permissions or user does not have valid roles. Please see document at https://techcommunity.microsoft.com/t5/Using-Microsoft-Graph-Security/Authorization-and-Microsoft-Graph-Security-API/m-p/184376",
"innerError": {
"request-id": "1319d099-7b14-4eb0-9834-4614d5231085",
"date": "2018-10-24T21:23:16"
}
}
}
我的权限是否有误?
最佳答案
你们非常接近。这里的问题是 scope
值 https://graph.microsoft.com/v1.0/security/alerts/.default
不正确。
如果您希望使用安全 API,则需要在应用注册中包含 SecurityEvents.Read.All
或 SecurityEvents.ReadWrite.All
(通过 https://apps.dev.microsoft.com )。
Important: Whenever you change the scopes for your application, you must repeat the Admin Consent process. Admin Consent only applies to the scopes you had configured at the time Consent was granted.
完成后,您需要告诉 /token
端点使用预先注册的范围。这是通过将 scope
属性设置为 https://graph.microsoft.com/.default
来完成的。您在这里所做的就是告诉它您想要使用 Microsoft Graph 的预注册 (.default
) 范围 (https://graph.microsoft.com/
):
d = {
"client_id": <client_id>,
"scope": ["https://graph.microsoft.com/.default"],
"client_secret": <client_secret>,
"grant_type": "client_credentials"
}
r = requests.post("https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token", data=d)
更新
您使用的 /token
端点存在其他问题。使用 client_credentials
时,您无法使用 /common
租户。由于没有用户进行身份验证,AAD 无法发现它应该针对哪个租户进行身份验证。在不知道哪个租户的情况下,它无法确定应应用哪些范围,这反过来又会导致 token 没有任何范围。
您需要明确提供您要为其获取 token 的租户 ID。您可以使用租户 ID(GUID)或域:
https://login.microsoftonline.com/00000000-0000-0000-0000-000000000000/oauth2/v2.0/token
https://login.microsoftonline.com/tenantdomain.onmicrosoft.com/oauth2/v2.0/token
关于python - 使用/token端点获取授权访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52959033/