1

我正在创建一个将使用 Microsoft Security Graph API 的 python 应用程序。我已按照此处提供的示例进行操作,没有任何问题。我现在希望能够创建一个 python 应用程序,它可以在不使用 Web 浏览器的情况下获取访问令牌(并在需要时刷新它)。

到目前为止,我已经在 和 下创建了一个具有和SecurityEvent.Read.All权限SecurityEvent.ReadWrite.All的新应用程序。然后,我在 Web 浏览器中访问以下 URL 以授予我的应用程序同意并使用我的租户管理员登录:Delegated PermissionsApplication Permissions

https://login.microsoftonline.com/common/adminconsent?
        client_id=APPLICATION_ID
        &state=12345
        &redirect_uri=REDIRECT_URL  

接下来,我假设我想按照此处的步骤进行 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"
    }
  }
}

我是否以某种方式拥有错误的权限?

4

2 回答 2

0

为什么这会被退回给我?我错过了一步吗?

您混淆了 Graph API 和 AAD Graph API。您应该遵循以下文档来实现客户端凭据流程:

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的更多信息。

于 2018-10-24T04:55:27.797 回答
0

你非常接近。这里的问题是scopehttps://graph.microsoft.com/v1.0/security/alerts/.default不正确。

如果您希望使用安全 API,您可能希望在应用程序的注册中包含SecurityEvents.Read.All或包含(通过https://apps.dev.microsoft.com)。SecurityEvents.ReadWrite.All

重要提示:每当您更改应用程序的范围时,您必须重复管理员同意流程。管理员同意仅适用于您在授予同意时配置的范围。

完成后,您需要告诉/token端点使用预先注册的范围。这是通过将scope属性设置为 来完成的https://graph.microsoft.com/.default。您在这里所做的是告诉它您要使用.defaultMicrosoft Graph ( 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
于 2018-10-24T07:06:18.510 回答