You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA请求Microsoft Graph API访问令牌提示缺少grant_type参数问题

VBA请求OAuth2访问令牌提示缺失grant_type参数问题

问题现象

尝试通过VBA代码请求访问令牌时,相同参数在Postman中请求可正常获取令牌,VBA运行时抛出如下错误:

"the request body must contain the following parameter: 'grant_type'"

问题代码

Dim objRequestGetToken As Object, JSONGetToken As Object
Dim strUrlGetToken As String, strClientID As String, strClientSecret As String, strResource As String, strBody As String
Dim blnAsyncGetToken As Boolean

strClientID = "XXX"
strClientSecret = "XXX"
strRecourse = "00000003-0000-0ff1-ce00-000000000000/XXX.sharepoint.com@XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"

strBody = "{""grant_type"":""client_credentials"",""client_id"":""" & strClientID & """,""client_secret"":""" & strClientSecret & """,""resource"":""" & strRecourse & """}"

Set objRequestGetToken = CreateObject("MSXML2.XMLHTTP.6.0")
strUrlGetToken = "https://accounts.accesscontrol.windows.net/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/tokens/OAuth/2/"
blnAsyncGetToken = False
Debug.Print strBody

With objRequestGetToken
    .Open "POST", strUrlGetToken, blnAsyncGetToken
    .SetRequestHeader "Content-Type", "application/json;odata=verbose"
    .SetRequestHeader "Accept", "application/json;odata=verbose"
    .send strBody
    'spin wheels whilst waiting for response
    While objRequestGetToken.readyState <> 4
        DoEvents
    Wend
    Set JSONGetData = JsonConverter.ParseJson(objRequestGetToken.ResponseText)
End With

Debug.Print objRequestGetToken.ResponseText

Postman请求配置

Postman配置截图1
Postman配置截图2

问题根因

OAuth 2.0的令牌端点默认要求请求体以x-www-form-urlencoded格式提交,原代码错误将请求头Content-Type设置为JSON格式,服务端无法解析JSON格式的请求参数,因此提示缺失grant_type参数。

注:下述最终代码里的请求头设置存在笔误,规范写法应为.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"

最终可运行代码

Dim objRequestGetToken As Object, JSONGetToken As Object
Dim strUrlGetToken As String, strClientID As String, strClientSecret As String, strResource As String, strBody As String
Dim blnAsyncGetToken As Boolean

strClientID = "XXX"
strClientSecret = "XXX"
strRecourse = "00000003-0000-0ff1-ce00-000000000000/XXX.sharepoint.com@XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"

strBody = "{""grant_type"":""client_credentials"",""client_id"":""" & strClientID & """,""client_secret"":""" & strClientSecret & """,""resource"":""" & strRecourse & """}"

Set objRequestGetToken = CreateObject("MSXML2.XMLHTTP.6.0")
strUrlGetToken = "https://accounts.accesscontrol.windows.net/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/tokens/OAuth/2/"
blnAsyncGetToken = False
Debug.Print strBody

With objRequestGetToken
    .Open "POST", strUrlGetToken, blnAsyncGetToken
    .SetRequestHeader "application", "x-www-form-urlencoded"
    .SetRequestHeader "Accept", "application/json;odata=verbose"
    .send strBody
    'spin wheels whilst waiting for response
    While objRequestGetToken.readyState <> 4
        DoEvents
    Wend
    Set JSONGetData = JsonConverter.ParseJson(objRequestGetToken.ResponseText)
End With

Debug.Print objRequestGetToken.ResponseText

内容的提问来源于stack exchange,提问作者Teun Smeyers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:45:03