python - 使用/token端点获取授权访问 token

标签 python microsoft-graph-api microsoft-graph-security

我正在创建一个将使用 Microsoft Security Graph API 的 python 应用程序。我已关注the sample provided here没有问题。我现在希望能够创建一个 python 应用程序,无需使用 Web 浏览器即可获取访问 token (并在需要时刷新它)。

到目前为止,我已经在委派权限下创建了一个具有SecurityEvent.Read.AllSecurityEvent.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"
    }
  }
}

我的权限是否有误?

最佳答案

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

如果您希望使用安全 API,则需要在应用注册中包含 SecurityEvents.Read.AllSecurityEvents.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/

相关文章:

python - django 形式的动态表

python - 对Python中数据帧的每个元素应用相同的计算

python - 是否可以在每个路由的基础上限制 Flask POST 数据大小?

azure-active-directory - Microsoft Azure AD 代表 B2C Flow

Office365 REST API - 日历事件附件对收件人不可见

azure-active-directory - 使用 AAD v2 的 Dynamics 365 API

c# - Microsoft Graph API 以 HTML 格式返回邮件正文

python - isinstance 运算符在继承时返回 false

c# - 如何在onedriveAPI的请求正文中指定@microsoft.graph.conflictBehavior

microsoft-graph-api - Office 365 安全与合规中心警报 api