【发布时间】:2018-08-09 12:42:08
【问题描述】:
我会试着勾勒一下我们的情况:
- 我们有一个需要连接到 Oath2 API 的 Wordpress 网站
- 我还没有使用 API 和 PHP 的经验
- 我们正在使用 PHP-Oath2 库,可在此处找到: https://github.com/adoy/PHP-OAuth2/tree/master/src/OAuth2
我们卡住的库中的方法是executeRequest。 这个方法可以在https://github.com/adoy/PHP-OAuth2/blob/master/src/OAuth2/Client.php的第404行(真是讽刺)找到
现在,就像我说的,我在 PHP 方面的经验很少,所以我的调试方式只是在脚本中的给定点回显变量的状态。 尽管这可能是业余爱好者,但我至少可以验证 url 和参数是否正确。我可以打印完整的 URL(c 的虚拟参数值):
注意使用以下参数:
code、redirect_uri、grant_typenclient_id和client_Secret。
当您执行此请求时,您会收到一条 JSON 错误消息。这很正常,因为我不能给你我们的 client_id 和 client_secret:
{"error":"error_occured","error_description":"Client authentication failed."}
当我在浏览器中手动执行此操作时(使用正确的参数值),我得到了所需的 JSON 结果:
{"access_token":"fa4a6s4axsaxxsfacc56c4aca8acac4q6d5z4fsv","token_type":"Bearer","expires_in":3600,"refresh_token":"X5s1aq56xaq6bhz56aGY6SCb9845465czxqde56a"}
问题是,当 CURL 构建并作为 POST 请求执行时,我得到一个错误的 JSON 结果:
{"error":"error_occured","error_description":"The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed. Check the \u0022code\u0022 parameter."}
我可以验证以下 CURL 选项的状态(请注意,代码绕过了 ssl 验证,Client.php 文件中的第 462 行):
- CURLOPT_RETURNTRANSFER = 真
- CURLOPT_SSL_VERIFYPEER = 假
- CURLOPT_SSL_VERIFYHOST = 假
- CURLOPT_CUSTOMREQUEST = 'POST'
- CURLOPT_POST = 真
- CURLOPT_POSTFIELDS = url 编码参数字符串
示例: code=irsyB0VSmg4V5dVjHFgdl85iRvvu3gYpsuIE4cOk&redirect_uri=https%3A%2F%2Fmycallbackurl.com%2Fmy-page%2Fgrant_type=authorization_code&client_id=5d6t5ev5a6d8&client_secret=pada9c54a6sc
- CURLOPT_URL = https://oauth.smartschool.be/OAuth/index/token
- CURLOPT_HTTPHEADER => 空数组
当像这样执行这个 Curl 处理程序时:
$result = curl_exec($ch);
他确实成功地联系了API并返回了结果,但是JSON结果显示参数错误,声称代码不正确。 但我知道这是正确的,因为当我通过浏览器手动执行请求时,它可以工作。如果你不带参数直接访问https://oauth.smartschool.be/OAuth/index/token,你会得到同样的错误。
这让我想知道 curl 是否传递了任何参数。
您能否告诉我您是否在提供的 ifno 中某处发现错误,也许是在 curl 选项中? 或者您能否指导我找到调试此 curl 执行的正确方法(请记住,我使用的是 Wordpress,如果这很重要的话)。
如果这篇文章缺少必要的信息,请告诉我。 提前谢谢你。
--编辑:
库代码由以下代码行触发(同样,虚拟客户端 ID 和密码)。这个方法可以在https://github.com/adoy/PHP-OAuth2/blob/master/src/OAuth2/Client.php的第211行找到
$client = new Client('5d6t5ev5a6d8', 'pada9c54a6sc');
$callBackUrl = 'https://mycallbackurl.com/my-page';
$myResponse = $client->getAccessToken('https://oauth.smartschool.be/OAuth/index/token', 'authorization_code', ['code'=> $_GET['code'], 'redirect_uri' => $callBackUrl]);
为了确定,我已经删除了将 header 选项放入空数组的代码。但是使用 CURLINFO_HEADER_OUT 调试时,结果保持不变。它确实默认为 Content-Type: application/x-www-form-urlencoded。 这是完整的 curl_getinfo() 数组:
数组 ( [url] => https://oauth.smartschool.be/OAuth/index/token [content_type] => 应用程序/json [http_code] => 200 [header_size] => 7414 [request_size] => 363 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 0.073514 [namelookup_time] => 3.9E-5 [connect_time] => 0.006093 [pretransfer_time] => 0.028232 [size_upload] => 216 [size_download] => 231 [speed_download] => 3142 [speed_upload] => 2938 [download_content_length] => -1 [上传内容长度] => 216 [开始传输时间] => 0.073476 [redirect_time] => 0 [redirect_url] => [primary_ip] => xxx.xxx.xxx.xxx [certinfo] => 数组 () [primary_port] => xxxxx [local_ip] => xxx.xxx.xxx.xxx [local_port] => xxxxxx [request_header] => POST /OAuth/index/token HTTP/1.1 主机:oauth.smartschool.be 接受:*/* 内容长度:216 内容类型:application/x-www-form-urlencoded )
但是,结果保持不变(仍然表明根本没有传递任何参数):
Array ( [result] => Array ( [error] => error_occured [error_description] => 请求缺少必需的参数, 包含无效的参数值,包含的参数超过 一次,否则格式不正确。检查“代码”参数。 ) [代码] => 200 [content_type] => 应用程序/json )
有没有办法从这个 curl 请求中打印参数/发布字段/正文,以验证所有信息是否已发送?
-- EDIT2:
使用 Tobias 提供的 httbin.org/post 链接后,我得到了以下结果:
Array (
[args] => Array
(
)
[data] =>
[files] => Array
(
)
[form] => Array
(
[client_id] => 5d6t5ev5a6d8
[client_secret] => pada9c54a6sc
[code] => fa4a6s4axsaxxsfacc56c4aca8acac4q6d5z4fsv
[grant_type] => authorization_code
[redirect_uri] => https://mycallbackurl.com/my-page
)
[headers] => Array
(
[Accept] => */*
[Connection] => close
[Content-Length] => 216
[Content-Type] => application/x-www-form-urlencoded
[Host] => httpbin.org
)
[json] =>
[origin] => 83.xxx.xx.xx
[url] => https://httpbin.org/post
)
将此与 Tobias 的示例进行比较,我没有发现任何值得注意的差异。我假设这意味着我们的 POST 请求至少包含所有必需的数据。我们在这里仍然处于黑暗中,那么 API 不接受参数的可能原因是什么。如果您想出一些其他可能的解决方案,请不要犹豫,追加它们。感谢这个转储链接,这真的很有用!
【问题讨论】:
-
你能在调用“executeRequest()”的地方加上传递给它的参数吗?
-
我添加了触发 getAccessToken() 的行。这个方法最后调用executeRequest()。
-
我尝试使用提供的信息 + 编辑您如何称呼它来设置 MCVE:pastebin.com/HGpW3dLx - 但是当我调用它时,我立即得到“客户端身份验证失败”。所需的响应。我正在使用 PHP 7.2.2。在您的环境中调用该脚本时是否收到错误消息?