Windev开发中调用OAuth2获取Outlook令牌时遇AADSTS90014错误
解决AADSTS90014错误:OAuth2授权码换令牌缺失
grant_type参数 我来帮你搞定这个头疼的错误!这个问题的根源非常明确——你的POST请求里漏掉了OAuth2授权码流程必须的grant_type参数,而且得确保整个请求的参数和格式都符合微软身份平台的要求。
核心问题分析
AADSTS90014错误直接提示请求体缺少grant_type,这是因为微软的令牌服务器需要通过这个参数判断你要使用哪种令牌获取流程。对于你现在的授权码流程,这个参数的固定值是authorization_code,没有它服务器根本无法识别你的请求意图。
具体修正步骤
1. 补全所有必填参数
除了grant_type,你还需要把以下参数都加入POST请求体中(所有参数值都要做URL编码):
client_id: 你在apps.dev.microsoft.com注册的应用IDcode: 用户授权后返回的授权码(注意这个码只能用一次,失效后需要重新获取)redirect_uri: 必须和你注册应用时填写的重定向URI完全一致client_secret: 如果你的应用是机密客户端(比如桌面/服务器应用),需要加上这个应用密钥(注意安全存储,不要硬编码在公开代码里)
2. 修正Windev中的请求代码
你原来的参数拼接只做了一部分,现在需要补充完整,同时设置正确的请求头:
// 初始化HTTP请求对象 hHTTP = HTTPNew() // 构建完整的请求参数(记得对特殊字符做URL编码) m_sParams = "grant_type=authorization_code" m_sParams += "&client_id=" + URLEncode(m_sClientID) m_sParams += "&code=" + URLEncode(m_sAuthorizationCode) m_sParams += "&redirect_uri=" + URLEncode(m_sRedirectURI) m_sParams += "&client_secret=" + URLEncode(m_sClientSecret) // 设置Content-Type为表单格式,这是OAuth2要求的 HttpRequestSetHeader(hHTTP, "Content-Type", "application/x-www-form-urlencoded") // 发送POST请求到正确的令牌端点 m_sResponse = HTTPPost(hHTTP, "https://login.microsoftonline.com/common/oauth2/v2.0/token", m_sParams) // 记得关闭HTTP对象 HTTPClose(hHTTP)
3. 额外注意事项
- 确认你的令牌端点正确:对于v2.0应用,端点是
https://login.microsoftonline.com/common/oauth2/v2.0/token,不要用v1.0的端点,否则会出现不兼容的问题。 - 如果你是桌面应用,微软更推荐使用PKCE流程来避免存储
client_secret,但如果暂时用client_secret的话,一定要确保密钥不会被泄露。
内容的提问来源于stack exchange,提问作者Adjan
相关产品推荐
相关产品推荐

