我正在创建一个将使用Microsoft Security Graph API的python应用程序。我一直遵循the sample provided here,没有任何问题。现在,我希望能够创建一个无需使用Web浏览器即可获取访问令牌(并在需要时刷新它)的python应用程序。
到目前为止,我已经在SecurityEvent.Read.All
和SecurityEvent.ReadWrite.All
下都创建了具有Delegated Permissions
和Application Permissions
权限的新应用程序。然后,我在网络浏览器中转到以下URL以授予我的应用程序同意,并以我的租户管理员身份登录:
https://login.microsoftonline.com/common/adminconsent?
client_id=APPLICATION_ID
&state=12345
&redirect_uri=REDIRECT_URL
接下来,我假设我想跟随the steps here进行POST调用以获得令牌。以下是我如何执行此操作的示例。
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"
}
使用现在获得的访问令牌,我正在尝试调用/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"
}
}
}
我权限有误吗?
答案 0 :(得分:0)
为什么要为我退货?我错过了一步吗?
您正在混淆Graph API和AAD Graph API。您应遵循以下docs来实施客户端凭据流程:
Register your app. Configure permissions for Microsoft Graph on your app. Get administrator consent. Get an access token. Use the access token to call Microsoft Graph.
有关如何使用Graph Security API的更多信息。
答案 1 :(得分:0)
您非常亲密。这里的问题是scope
值https://graph.microsoft.com/v1.0/security/alerts/.default
不正确。
如果您想使用安全性API,则希望在应用程序的注册中包含SecurityEvents.Read.All
或SecurityEvents.ReadWrite.All
(通过https://apps.dev.microsoft.com)。
重要:每当更改应用程序的范围时,都必须重复“管理员同意”过程。管理员同意书仅适用于您在同意书被授予时配置的范围。
完成此操作后,您需要告诉/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无法找到它应针对哪个租户进行身份验证。在不知道哪个租户的情况下,它无法确定应应用哪些范围,这反过来会导致令牌没有任何范围。
您需要明确提供您要为其获取令牌的租户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