"不支持访问授权authorization_code"来自Azure AD使用Oauth 2

时间:2014-08-20 15:26:07

标签: azure active-directory oauth-2.0

我正在使用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}}个文档?

2 个答案:

答案 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",