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

37

我在Windev开发中使用Oauth 2.0进行授权,以便从用户那里获取访问Outlook邮件的权限。

该应用程序已在https://apps.dev.microsoft.com注册,但未使用Implicit工作流程。用户输入凭据后,将返回授权代码。使用新代码请求Bearer令牌需要使用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工作吗?


根据这篇帖子,oauth-2.0参数必须在请求内容中。你已经尝试过了吗? 这篇帖子还警告了请求体的编码。 - Bidjes
谢谢指导。 a) 它必须在正文中,而不是标题中。 b) 它必须以纯文本编码。 然后它就可以工作了。 - Adjan
6个回答

29

不应该在请求参数或请求头中发送 grant_type。这些应该作为请求体参数发送,只有这样才能起作用。

URL: https://login.microsoftonline.com/common/oauth2/v2.0/token client_idscoperedirect_uri 参数可以作为查询参数发送。 而grant_typecodeclient_secret 应该作为请求体参数发送。

grant_type:authorization_code, 
code: {code you got from the authorization step}, 
client_secret: ****

2
将参数转换为FormData - https://dev59.com/4FYN5IYBdhLWcg3wT2ta#47630754 - Mahesh Samudra
client_id、scope和redirect_uri也必须在请求体中发送。 - Julien Seligmann
33
我的天,这项服务真是太糟糕了! - Askdesigners
2
如果您正在使用axios正确创建参数,请阅读此文档。我按照这种方式输入了所有的参数,它对我起作用了。 - perustaja
将参数转换为FormData对我有用! - bluefox
这很有趣,因为我不得不将它更改为x-www-form-urlencoded才能使其正常工作。在头部中,我将content-type设置为application/x-www-form-urlencoded - grietbroek

26

你需要将所有内容作为 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/'

这也适用于认证部分吗?我在授权端点处遇到了这个错误,据我所知,这是在令牌端点调用之前发生的。 - Christopher Pisz

8

您应将内容类型更改为:application/x-www-form-urlencoded

表单必须格式化如下:

 client_id=8cfbe8ac-8775-4c56-9302-k9d5a42cbf98
 &client_secret=BOy7Q~pGvXF.SWshX72mmMnQeAkvN5elHWiYT
 &grant_type=client_credentials
 &resource=https://miurl.com

6
如果有人仍然遇到此问题,您可以尝试类似下面的 Postman。请检查正文类型是否为“x-www-form-urlencoded”。

enter image description here


1

在参考了多个答案之后,我终于做对了。

POST https://login.microsoftonline.com//oauth2/token --请务必直接输入ID,不要加上 <,>

使用 'x-www-form-urlencoded' 格式来填写 Body。 为以下参数输入 Key 和 Value: client_id - Azure 应用的 Client_ID client_secret - client_secret 值而非密钥。请注意,此值仅在客户端密钥创建时第一次提供。 grant_type - client_credentials(静态词语,请不要查找 value 值) resource - 应用程序 ID URI

参考链接 - https://learn.microsoft.com/en-us/previous-versions/azure/dn645543(v=azure.100)?redirectedfrom=MSDN


0

在提供“默认范围”值时,必须使用全名示例,例如,“User.Read”,正确的值可以从Azure AD APP -> Api权限中获取


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接