Python请求库不工作,而cURL正在工作
我需要使用Python从Microsoft API检索JWT(JSON Web令牌)(查看Microsoft Graph的API文档) 下面使用Python请求库不工作,而cURL正在工作,python,python-3.x,python-requests,jwt,microsoft-graph-api,Python,Python 3.x,Python Requests,Jwt,Microsoft Graph Api,我需要使用Python从Microsoft API检索JWT(JSON Web令牌)(查看Microsoft Graph的API文档) 下面使用requests库的Python代码无法给出HTTP响应代码400,但是,等效的cURL命令可以返回包含JWT的预期JSON Python/请求代码: tenant = "<MY_FOO_TENANT>" token_url = "https://login.microsoftonline.com/{}/oauth2/v2.0/token".
requests
库的Python代码无法给出HTTP响应代码400,但是,等效的cURL命令可以返回包含JWT的预期JSON
Python/请求
代码:
tenant = "<MY_FOO_TENANT>"
token_url = "https://login.microsoftonline.com/{}/oauth2/v2.0/token".format(tenant)
http_headers = {
'Content-Type': 'application/x-www-form-urlencoded',
}
http_query_params = {
"client_id": "<MY_FOO_C_ID>",
"scope": "<MY_FOO_SCOPE>",
"client_secret": "<MY_FOO_C_SECRET>",
"grant_type": "client_credentials",
}
http_response = requests.post(token_url, params=http_query_params, headers=http_headers)
tenant=“”
令牌\u url=”https://login.microsoftonline.com/{}/oauth2/v2.0/token.”格式(租户)
http_头={
“内容类型”:“应用程序/x-www-form-urlencoded”,
}
http_查询_参数={
“客户id”:“,
“范围”:“范围”,
“客户机密”:“,
“授予类型”:“客户端凭据”,
}
http\u response=requests.post(令牌url,参数=http\u查询参数,头=http\u头)
cURL命令:
curl -v -X POST \
--data-urlencode 'client_id=<MY_FOO_C_ID>' \
--data-urlencode 'scope=<MY_FOO_SCOPE>' \
--data-urlencode 'client_secret=<MY_FOO_C_SECRET>' \
--data-urlencode 'grant_type=client_credentials' \
-H 'Content-Type: application/x-www-form-urlencoded' \
'https://login.microsoftonline.com/<MY_FOO_TENANT>/oauth2/v2.0/token'
curl-v-X POST\
--数据urlencode“客户端\u id=”\
--数据urlencode'scope='\
--数据urlencode“客户端\u密码=”\
--数据urlencode“授予\类型=客户端\凭据”\
-H'内容类型:应用程序/x-www-form-urlencoded'\
'https://login.microsoftonline.com//oauth2/v2.0/token'
从请求
库的详细输出中,我可以看到它是对所有HTTP查询参数进行URL编码的,因此我倾向于认为这不应该是问题所在
- Python实现有什么问题
- 如何让它工作
http\u query\u params
作为数据
传递,而不是参数
。请尝试以下代码:
tenant = "<MY_FOO_TENANT>"
token_url = "https://login.microsoftonline.com/{}/oauth2/v2.0/token".format(tenant)
http_headers = {
'Content-Type': 'application/x-www-form-urlencoded',
}
http_body = {
"client_id": "<MY_FOO_C_ID>",
"scope": "<MY_FOO_SCOPE>",
"client_secret": "<MY_FOO_C_SECRET>",
"grant_type": "client_credentials",
}
http_response = requests.post(token_url, data=http_body, headers=http_headers)
tenant=“”
令牌\u url=”https://login.microsoftonline.com/{}/oauth2/v2.0/token.”格式(租户)
http_头={
“内容类型”:“应用程序/x-www-form-urlencoded”,
}
http_body={
“客户id”:“,
“范围”:“范围”,
“客户机密”:“,
“授予类型”:“客户端凭据”,
}
http\u response=requests.post(令牌\u url,数据=http\u body,头=http\u头)
希望这有帮助谢谢你的帮助,它会起作用。然而,这意味着
http\u query\u params
不是真正的http查询参数(?xxx=yyy&aaa=bbb
),而是http请求主体,对吗?它之所以能在cURL
中工作,是因为--data-urlencode
实际上并没有编码HTTP查询参数,而是因为“表单头格式”(HTTP header内容类型:application/x-www-form-urlencoded
)而对HTTP请求体进行了URL编码,对不对,我明白了,基本上你不希望它出现在请求的主体中,而希望它出现在URL中?我想我是被“表单头”和我对cURL--data urlencode
的误解所欺骗的。您的建议有效,查看请求
文档,似乎数据=
参数是针对HTTP主体的。因此,基本上,当将这些键/值对表示为(URL编码的)HTTP查询参数时,Microsoft文档中的示例有点误导!那么,我的代码解决了您的问题吗?或者您现在面临任何其他问题?是的,我只想补充一点,http\u query\u params
应该重命名为http\u body
,并且(AFAIK)这可能作为http body工作,因为http头内容类型:application/x-www-form-urlencoded
。