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请求配置


问题根因
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
相关产品推荐
相关产品推荐

