我正在使用Azure AD处于Authorization Code Grant Flow的中间位置。即使文档说grant_type
应该是authorization_code
,我也会收到有关此属性的错误消息。
POST https://login.windows.net/SOME_AZURE_AD_UUID/oauth2/token?api-version=1.0
Content-Type: application/x-www-form-urlencoded
client_id=SECRET_CLIENT_ID
&client_secret=SECRET_CLIENT_SECRET
&code=SECRET_CODE
&grant_type=authorization_code
&redirect_uri=https://myserver.example.com/login/auth_return
&resource=https://myserver.example.com/
&scope=openid email
(编辑:为了清晰起见添加了空格)
我回来的错误:
HTTP/1.1 400 Bad request
Content-Length: 436
X-Content-Type-Options: nosniff
X-Powered-By: ASP.NET
Request-Id: SOME_REQUEST_ID
X-Ms-Request-Id: SOME_REQUEST_ID
Strict-Transport-Security: max-age=31536000; includeSubDomains
Set-Cookie: x-ms-gateway-slice=slicea; path=/; secure; HttpOnly, stsservicecookie=acs; path=/; secure; HttpOnly
Server: Microsoft-IIS/8.0
Cache-Control: private
Date: Wed, 20 Aug 2014 14:44:08 GMT
Content-Type: application/json; charset=utf-8
{
"correlation_id": "SOME_CORRELATION_ID",
"error": "unsupported_grant_type",
"error_codes": [
70003
],
"error_description": "
ACS70003: The access grant 'authorization_code' is not supported.\r\n
Trace ID: SOME_TRACE_UUID\r\n
Correlation ID: SOME_CORRELATION_ID\r\n
Timestamp: 2014-08-20 14:44:08Z",
"timestamp": "2014-08-20 14:44:08Z",
"trace_id": "SOME_TRACE_UUID"
}
(为了清晰起见,添加了空格)
如果我将grant_type
更改为client_credentials
(但我没有找到将所得到的令牌用于我需要的方法),此请求确实有效。如果我将某些网址更改为指向Google而非Azure AD,也可以使用它。
这些请求是否存在错误,或者该服务是否真的不支持grant_type
的{{1}}个文档?
答案 0 :(得分:4)
我相信这是一个错误,我花了2-3天才弄明白。请执行以下操作以使其正常工作,
1)删除"?api-version = 1.0"来自您的网址。我知道这听起来很奇怪,但相信我,他们的文档很乱。
2)添加"内容类型":" application / x-www-form-urlencoded"您的请求中的标头(因此您必须对发布数据值进行编码...例如redirect_url =(encodedURL)等
3)从帖子数据 REFER 中删除不必要的字段......它应该像
{
'grant_type': "authorization_code",
'resource': "your resource",
'client_id': "your client Id",
'redirect_uri': "your redirect URL",
'client_secret': "your client secret",
'code': "the code u got"
}
我看到你已经完成了第2点,所以你需要做第1点,你就可以了。
此外,如果你想快速获得access_token(如果我说的没有任何作用),那么传递" client_credentials"在grant_type中,您将使用access_token获得较小的响应。但是,如果您想要使用refresh_token完成响应,那么您必须执行所有这些步骤。
修改的: 对于Refresh Tokens>>>,他们的文档中还有一个错误。网址应为 oauth2 / token 而不是 oauth2 / authorize
希望这有帮助!
答案 1 :(得分:0)
尝试
'grant_type':"client_credentials",
'resource': "your resource",
'client_id': "your client Id",
'redirect_uri': "your redirect URL",
'client_secret': "your client secret",