oauth2错误AADSTS90014:请求正文必须包含以下参数:'授权类型'

eqzww0vc  于 2022-11-21  发布在  其他
关注(0)|答案(5)|浏览(302)

从 开发 的 Windev 我 使用 Oauth 2.0 授权 获得 访问 Outlook 邮件 从 一 个 用户 。
应用 程序 在 https://apps.dev.microsoft.com 注册 , 不 使用 隐 式 工作 流 。 用户 输入 凭据 后 , 将 返回 授权 代码 。 使用 新 代码 , 将 通过 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 工作 需要 什么 ?

js4nwp54

js4nwp541#

你不应该发送grant_type,无论是在参数中还是在标头中。这些应该在body params中发送,这样才能正常工作。
URL:https://login.microsoftonline.com/common/oauth2/v2.0/tokenclient_idscoperedirect_uri参数可以作为查询参数发送。其中grant_typecodeclient_secret应作为正文参数发送。

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

yx2lnoni2#

您 需要 以 form-data 的 形式 传递 body 中 的 所有 内容 :

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/'

中 的 每 一 个

jslywgbw

jslywgbw3#

应将内容类型更改为:应用程序/x-www-表单-网址编码
主体必须如下形成:

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

gajydyqb4#

在参考了多个答案后,我终于答对了。
POST https://login.microsoftonline.com//oauth2/token --确保直接输入ID而不使用〈,〉
对正文使用“x-www-form-urlencoded”格式。在Azure应用程序client_secret - client_secret值而不是密钥上输入以下参数client_id - Client_ID的密钥和值。请注意,此值仅在首次创建客户端密钥时可用grant_type - client_credentials(静态字,不要尝试查找该值)resource -应用程序ID URI
参考链接-https://learn.microsoft.com/en-us/previous-versions/azure/dn645543(v=azure.100)?redirectedfrom=MSDN

ui7jx7zq

ui7jx7zq5#

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

相关问题