Microsoft graph api 请求访问令牌时的资源参数?

Microsoft graph api 请求访问令牌时的资源参数?,microsoft-graph-api,Microsoft Graph Api,我正在跟踪以使用Microsoft Graph进行身份验证。我能够成功地执行第一个请求(请求授权码),但第二个请求(请求访问令牌)有问题 第二个请求的参数(用于访问令牌): 我在文档中没有看到这个资源参数,除了在上获取访问令牌下的示例 我的问题是: 当我的请求似乎与文档匹配时,为什么会出现上述错误 何时需要包含资源参数 编辑:见下面Marc的回答和我的评论回复 原来我使用了以下URL: https://login.microsoftonline.com/common/oauth2/authori

我正在跟踪以使用Microsoft Graph进行身份验证。我能够成功地执行第一个请求(请求授权码),但第二个请求(请求访问令牌)有问题

第二个请求的参数(用于访问令牌):

我在文档中没有看到这个资源参数,除了在上获取访问令牌下的示例

我的问题是:

  • 当我的请求似乎与文档匹配时,为什么会出现上述错误
  • 何时需要包含资源参数
  • 编辑:见下面Marc的回答和我的评论回复

    原来我使用了以下URL:

    https://login.microsoftonline.com/common/oauth2/authorize
    https://login.microsoftonline.com/common/oauth2/token

    当我应该使用:

    https://login.microsoftonline.com/common/oauth2/v2.0/authorize
    https://login.microsoftonline.com/common/oauth2/v2.0/token

    在使用了带有
    v2.0
    的那些之后,我不再需要在令牌请求中包含我的
    资源
    参数。

    根据

    目标资源无效,因为它不存在,Azure AD找不到它,或者配置不正确

    根据,

    …与Azure AD集成的任何第三方资源也是如此。这些资源中的任何一个都可以定义一组权限,用于将该资源的功能划分为更小的块

    然后

    通过定义这些类型的权限,资源可以对其数据以及数据的公开方式进行细粒度控制。第三方应用程序可以向应用程序用户请求这些权限。应用程序用户必须先批准权限,应用程序才能代表用户行事。通过将资源的功能分块成更小的权限集,可以构建第三方应用程序,只请求执行其功能所需的特定权限。应用程序用户可以准确地知道应用程序将如何使用他们的数据,并且他们可以更加确信应用程序没有恶意行为


    因此,要回答1)我认为您只需要在Azure广告页中为您的应用程序指定user.read权限。回答2)您不会为第三方应用程序指定资源。

    看起来您提供了正确的属性,但格式不正确。要获取令牌,您需要将此数据格式化为
    application/x-www-form-urlencoded
    发送到
    https://login.microsoftonline.com/common/oauth2/v2.0/token
    。从您的示例来看,它看起来像是您以
    JSON
    而不是
    x-www-form-urlencoded
    的形式发送数据

    POST URL: https://login.microsoftonline.com/common/oauth2/v2.0/token
    POST HEADER: Content-Type: application/x-www-form-urlencoded
    POST BODY: grant_type=authorization_code&code=[AUTHORIZATION CODE]&
               client_id=[APPLICATION ID]&client_secret=[PASSWORD]
               &scope=[SCOPE]&redirect_uri=[REDIRECT URI]
    

    几个月前我写了一篇文章,也许能帮助你完成这个过程

    这是针对Microsoft Graph应用程序(不是Azure AD),我在Microsoft Graph应用程序页面上设置了user.read委派权限。您已链接到Azure AD指南,这是我困惑的根源。您可能需要启用Azure广告权限才能使该示例正常工作。嗨,Marc,感谢您的回复和精彩的博客文章。我在我的问题中设置了一些奇怪的参数。我通过POST将其发送至,内容类型为:application/x-www-form-urlencoded,并通过正文发送我的参数。如果有关系的话,我现在只是在使用Postman,但最终将通过Java(但不是Android)来实现这一点。所以,我仍然在做你在回答和博客文章中所说的一切,但仍然得到同样的错误。你还有别的想法吗?或者需要我提供其他细节?明白。你能在你的通话中添加完整的URI和标题吗?算了吧!根据您的建议,我仔细查看了我的URL,结果发现我使用的是
    https://login.microsoftonline.com/common/oauth2/authorize
    https://login.microsoftonline.com/common/oauth2/token
    (没有
    v2.0
    )这就是问题所在。我不确定我是如何得到不匹配的URL的,但这就是问题所在。我只是简单地将两者都设置为
    v2.0
    ,一切都开始工作了。我会接受你的回答,因为它是正确的。我会确保从一开始就包含完整的URL。URL的“2.0”部分正是我所需要的,谢谢!
    {
      "error": "invalid_resource",
      "error_description": "AADSTS50001: Resource identifier is not provided.\r\nTrace ID: <my trace id>\r\nCorrelation ID: <my correlation id>\r\nTimestamp: 2017-05-03 15:25:42Z",
      "error_codes": [
        50001
      ],
      "timestamp": "2017-05-03 15:25:42Z",
      "trace_id": <my trace id>,
      "correlation_id": <my correlation id>
    }
    
    resource: https://graph.microsoft.com/
    
    POST URL: https://login.microsoftonline.com/common/oauth2/v2.0/token
    POST HEADER: Content-Type: application/x-www-form-urlencoded
    POST BODY: grant_type=authorization_code&code=[AUTHORIZATION CODE]&
               client_id=[APPLICATION ID]&client_secret=[PASSWORD]
               &scope=[SCOPE]&redirect_uri=[REDIRECT URI]