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

twb*_*bas 7 microsoft-graph

我正在按照本指南进行Microsoft Graph身份验证.我能够成功完成第一个请求(对于授权代码)但是遇到了第二个请求(请求访问令牌)的问题.

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

client_id: <my id>
client_secret: <my secret>
code: <authorization code returned from first request>
redirect_uri: http://localhost:8080/Callback
grant_type: authorization_code
scope: https://graph.microsoft.com/user.read
Run Code Online (Sandbox Code Playgroud)

第二次请求出错:

{
  "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>
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我添加这个额外的参数,我的请求工作正常(返回一个承载和刷新令牌):

resource: https://graph.microsoft.com/
Run Code Online (Sandbox Code Playgroud)

除了在此页面获取访问令牌下的示例之外,我没有在文档中的任何位置看到此资源参数.

我的问题是:

  1. 当我的请求似乎与文档匹配时,为什么会出现上述错误?
  2. 我什么时候需要包含资源参数?

编辑:请参阅下面的Marc答案以及我的评论回复.

原来我使用以下网址:

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,我不再需要resource在令牌请求中包含我的参数.

Mar*_*eur 5

看起来您提供了正确的属性,但格式不正确。要获取令牌,您需要发出一个 POST 格式的数据为application/x-www-form-urlencodedto 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]
Run Code Online (Sandbox Code Playgroud)

几个月前我写了一篇Microsoft v2 Endpoint Primer,它可能会帮助您完成整个过程。

  • 弄清楚了!根据您的建议,我仔细查看了我的 URL,结果发现我使用的是 `https://login.microsoftonline.com/common/oauth2/authorize` 和 `https://login.microsoftonline.com/common/oauth2/ token`(没有 `v2.0`),这就是问题所在。我不确定我是如何得到不匹配的 URL 的,但这就是问题所在。我只是简单地将两者都设置为“v2.0”,一切都开始工作了。我会接受你的回答,因为它是正确的。我会确定并从一开始就包含完整的 URL。 (2认同)