oauth2错误AADSTS90014:请求正文必须包含以下参数:' grant_type'

时间:2018-03-27 12:40:48

标签: http oauth-2.0 bearer-token windev

从Windev的开发中,我使用Oauth 2.0授权来访问用户的Outlook邮件。

应用程序在https://apps.dev.microsoft.com注册,没有Implicit工作流程。 用户输入凭据后,将返回授权码。 使用新代码,使用HTTP Post命令请求承载令牌。

到目前为止,非常好。

只有响应会给出一条对我没有意义的错误消息。

在代码中:

m_sHTTPUrl = "client_id=" + m_sClientID + "&client_secret=" ...
    + m_sClientSecret ...
    + "&redirect_uri=" + m_sRedirectURL + "&code=" + m_sAuthToken ...
    + "&grant_type=authorization_code"
m_sHTTPres = ""
LogLocalFile("GetAccessToken - " + m_sTokenURL + " // " + m_sHTTPUrl) 

cMyRequest is httpRequest
cMyRequest..Method = httpPost
cMyRequest..URL = m_sTokenURL
cMyRequest..ContentType = "application/x-www-form-urlencoded"
cMyRequest..Header["grant_type"] = "authorization_code"
cMyRequest..Header["code"] = m_sAuthToken
cMyRequest..Header["client_id"] = m_sClientID
cMyRequest..Header["client_secret"] = m_sClientSecret
cMyRequest..Header["scope"] = m_sScope
cMyRequest..Header["redirect_uri"] = m_sRedirectURL
//cMyRequest..Content = m_sHTTPUrl
cMyResponse is httpResponse = HTTPSend(cMyRequest)
m_sHTTPres = cMyResponse.Content

在日志文件中,我请求使用的参数和httpResponse的内容:

GetAccessToken - https://login.microsoftonline.com/common/oauth2/v2.0/token // grant_type=authorization_code
&code=xxxxxxx
&scope=openid+offline_access+User.Read+Email+Mail.Read+Contacts.Read
&redirect_uri=http://localhost/
&client_id=xxxxxxx
&client_secret=xxxxxxx

GetAccessToken - error = invalid_request
GetAccessToken - error_description = AADSTS90014: The request body must contain the following parameter: 'grant_type'.

grant_type位于标题中,应该是。

有没有人知道让OAUTH2工作需要什么?

4 个答案:

答案 0 :(得分:3)

您需要将身体中的所有内容都传递为form-data

curl --location --request POST 'https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token' \
--form 'grant_type=authorization_code' \
--form '<the code you have got from the authorization endpoint' \
--form 'client_secret=****' \
--form 'client_id=********' \
--form 'scope=m_sScope' \
--form 'redirect_uri=http://localhost/'

答案 1 :(得分:0)

根据此post,oauth-2.0参数必须包含在您的请求内容中。你有没试过? 这个post也警告身体的编码。

答案 2 :(得分:0)

您既不应该在参数中也不在标头中发送grant_type,应该在 body params 中发送它们,然后才可以使用。 网址:https://login.microsoftonline.com/common/oauth2/v2.0/token client_id,scope和redirect_uri参数可以作为查询参数发送。 在主体参数中应以Grant_type,code和client_secret的形式发送。

grant_type:authorization_code, 代码:{您从授权步骤获得的代码}, client_secret:****

答案 3 :(得分:0)

当提供“默认范围”值必须为全名示例时,可以从azure AD APP-> Api权限

获取正确的“ User.Read”值