Oauth 2.0 Microsoft graph API:无法获取具有生成的访问令牌的用户

Oauth 2.0 Microsoft graph API:无法获取具有生成的访问令牌的用户,oauth-2.0,azure-active-directory,microsoft-graph-api,azure-ad-graph-api,msal,Oauth 2.0,Azure Active Directory,Microsoft Graph Api,Azure Ad Graph Api,Msal,我已在Azure portal中注册了该应用程序,并已生成客户端密码。 我需要客户端授权流,并且我还授予了应用程序权限。我已经授予管理员同意,因为我自己也是管理员 我能够使用给定的url生成访问令牌: https://login.microsoftonline.com/47be0abf-c6a1-4f04-a665-dceb081c4ff1/oauth2/v2.0/token?client_id=********&client_secret=******&grant_type=c

我已在Azure portal中注册了该应用程序,并已生成客户端密码。 我需要客户端授权流,并且我还授予了应用程序权限。我已经授予管理员同意,因为我自己也是管理员

我能够使用给定的url生成访问令牌:

https://login.microsoftonline.com/47be0abf-c6a1-4f04-a665-dceb081c4ff1/oauth2/v2.0/token?client_id=********&client_secret=******&grant_type=client_credentials&scope=User.ReadBasic.All%20User.Read%20User.ReadWrite%20User.Read.All%20User.ReadWrite.All%20Directory.Read.All%20Directory.ReadWrite.All%20Directory.AccessAsUser.All
但是,当我使用生成的令牌访问以下url时,会收到特权不足消息

https://graph.microsoft.com/v1.0/users
Authorization Bearer eyJ0eXAiOiJKV1QiLCJub25jZSI6IkFRQUJBQUFBQUFEQ29NcGpKWHJ4VHE5Vkc5dGUtN0ZYNndkRlV3aTBKbGlHcWhEWkgybFRlYWh6SUhUX0VsazFaYTFuUHRzNWo3SW5xMDBmbnNNRkpNUWRYdWdVZnpaZ0cxT19uenNPTXpwN2tpUFFIR2VHTnlBQSIsImFsZyI6IlJTMjU2IiwieDV0IjoiQ3RmUUM4TGUtOE5zQzdvQzJ6UWtacGNyZk9jIiwia2lkIjoiQ3RmUUM4TGUtOE5zQzdvQzJ6UWtacGNyZk9jIn0.eyJhdWQiOiJodHRwczovL2dyYXBoLm1pY3Jvc29mdC5jb20iLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC80N2JlMGFiZi1jNmExLTRmMDQtYTY2NS1kY2ViMDgxYzRmZjEvIiwiaWF0IjoxNTYwMjUzMDE1LCJuYmYiOjE1NjAyNTMwMTUsImV4cCI6MTU2MDI1NjkxNSwiYWlvIjoiNDJaZ1lQajhVdnBwWGMySEU1WGZwbnZxSG43akFnQT0iLCJhcHBfZGlzcGxheW5hbWUiOiJUdXRvcmlhbCBTYW1wbGUgQXBwIiwiYXBwaWQiOiI2NzMxZGU3Ni0xNGE2LTQ5YWUtOTdiYy02ZWJhNjkxNDM5MWUiLCJhcHBpZGFjciI6IjEiLCJpZHAiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC80N2JlMGFiZi1jNmExLTRmMDQtYTY2NS1kY2ViMDgxYzRmZjEvIiwib2lkIjoiNjg0ZjkzMjUtNjUyNS00Yjk5LTgwNzktOTEyOGZjZWNlNGViIiwic3ViIjoiNjg0ZjkzMjUtNjUyNS00Yjk5LTgwNzktOTEyOGZjZWNlNGViIiwidGlkIjoiNDdiZTBhYmYtYzZhMS00ZjA0LWE2NjUtZGNlYjA4MWM0ZmYxIiwidXRpIjoiSkZjUE9SSHRGVTJMMWludEpkY2RBQSIsInZlciI6IjEuMCIsInhtc190Y2R0IjoxMzQ0Njc5MzA0fQ.fXEs7eClm5SYXychcKXbTfcc5gtvyyMa5fDWuGu2vqQ4Zc6V0jJSHSeksRiOzYE8SOJXRTmI9vJtbs2XIMFr0CRHeTgoCDReV8JWJ8yhOKiDnc-_2AHtSoBnqt6ibF0eX4AzkyioJd24-uYTSkheC_zDpd6GS3T5T077BU_1M7kpngXDfEICi38VkddcpdBUG8FgHUSPq0S9fCosIB4_JPwspq3QC6jJyoRrj1Yj2oR8FwBA1dpgWq_e0QoGnWXgT6EhBKedjY0hwHGY-F73ndvRlAKKW63JYucdOtRyC2zFDc4DPwhN1nyPlh86_Y0Zru8UTb0QgWRFKbGZwQcEOg
我已尝试更改权限,并添加和删除了权限

{
"error": {
    "code": "Authorization_RequestDenied",
    "message": "Insufficient privileges to complete the operation.",
    "innerError": {
        "request-id": "aa38f822-7325-44ad-9127-3cb4779578bf",
        "date": "2019-06-11T11:42:16"
    }
}
}

更新:包括权限屏幕截图配置

令牌的JWT调试器输出:

{
  "aud": "https://graph.microsoft.com",
  "iss": "https://sts.windows.net/f77804fb-8607-4e96-9fae-231360cc82b7/",
  "iat": 1560273380,
  "nbf": 1560273380,
  "exp": 1560277280,
  "aio": "42ZgYKjulnV3u/vJZNN0gz3ld2ZpAwA=",
  "app_displayname": "clmapp",
  "appid": "82ad79f2-27c7-4304-92f6-e3ffdb637e72",
  "appidacr": "1",
  "idp": "https://sts.windows.net/f77804fb-8607-4e96-9fae-231360cc82b7/",
  "tid": "f77804fb-8607-4e96-9fae-231360cc82b7",
  "uti": "BpTbRLEb5ECSO3qjslIgAA",
  "ver": "1.0",
  "xms_tcdt": 1376441181
}

使用OAuth 2.0客户端凭据授予流时,您的作用域值应使用您试图访问的资源的内置
.default
作用域。参考文章中提到了这一点:

在您的情况下,您试图访问的资源是Microsoft Graph,因此令牌请求中的
范围
值应该是
https://graph.microsoft.com/.default

https://login.microsoftonline.com/{tenant-id-or-domain}/oauth2/v2.0/token
    &grant_type=client_credentials
    &client_id={client-id}
    &client_secret={client-secret}
    &scope=https%3a%2f%2fgraph.microsoft.com%2f.default
请注意,要使此操作成功,必须配置应用程序所需的权限(Azure portal>Azure Active Directory>应用程序注册>API权限)并授予:


您可以尝试以下方法:

权限:

确保您具有以下内容:

授予Azure门户的权限:

步骤:1

API权限
菜单上选择
Application permissions

步骤:2

选择
应用程序权限下的
User.ReadWrite.All
,但
User.Read.All也可以

令牌请求格式:

网址:
https://login.microsoftonline.com/YourTenant.onmicrosoft.com/oauth2/token

对于V2.0 URL:
https://login.microsoftonline.com/YourTenant.onmicrosoft.com/oauth2/v2.0/token

HTTP动词:POST

grant_type:client_credentials
client_id:b603c7be-a866-4-e6921e61f925
client_secret:Vxf1SluKbguf3wE5oGl/2XDSeZ8wL/Yp8ns4sc=
resource:https://graph.microsoft.com
对于V2.0,范围将为:
范围:https://graph.microsoft.com/.default

请参见下面的屏幕截图:

解码令牌并确认权限:

您可以使用来解码您的令牌,以确保您具有所需的权限:请参阅下面的屏幕截图:

请求用户列表:

使用此端点上的
令牌
请求
https://graph.microsoft.com/v1.0/users
。请参见下面的屏幕截图。我已成功获取所有用户列表


我再次尝试使用默认范围。事实上,我之前也试过。它显示了类似的错误消息。我还更新了问题,每个链接都有许可的屏幕截图。我更改了
accessTokenAcceptedVersion“:2
。但它也没有解决任何问题。您确定屏幕截图中的应用程序(具有授予的权限)与您用于获取访问令牌(客户端id)的应用程序相同吗?您确定授予权限的租户与您用于令牌请求的租户相同吗?是的。非常确定。事实上,注册了一个新应用程序。但它不起作用。您问题中的令牌请求使用租户ID
47be0abf-c6a1-4f04-a665-dceb081c4ff1
,但您显示的令牌示例来自tenant ID
f77804fb-8607-4e96-9fae-231360cc82b7
。请更新问题,以便令牌请求和API请求(以及错误响应)正确无误匹配您使用的实际租户和令牌?不要像上面那样包含完全访问令牌,因为任何人都可以使用它访问您组织的数据。可以包含解码令牌(JSON)因为这不能用于API。问题仍然存在吗?还是解决了?它仍然存在。我尝试了下面给出的解决方案,但没有效果。欢迎您的建议。请看一看。我希望您的问题能够解决!如果仍然存在任何问题,请告诉我。现在可以了吗?我只需要给予应用程序许可即可对于客户端授权流-根据文档?是的,应用程序权限是可以的。只需遵循我的示例。如果您仍然有任何问题,请告诉我。我生成的令牌在jwt调试器中验证时没有显示角色?可以吗?我尝试了相同的步骤。仍然是相同的错误。不,不可以,我猜您的权限没有被授予,首先
API权限>添加权限>Microsoft Graph>Application permissions>User>User.Read.All>add permissions>Grand Admin Concent For>Yes
。然后等待30秒,然后生成您的令牌,当您解码时,JWT上应显示对用户ListToken的请求。然后重试。如果一切正常,请告诉我。