Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python请求库不工作,而cURL正在工作_Python_Python 3.x_Python Requests_Jwt_Microsoft Graph Api - Fatal编程技术网

Python请求库不工作,而cURL正在工作

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".

我需要使用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".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