PHP:向外部Oath2 API发出POST请求

时间:2018-08-09 12:42:09

标签: php api curl

我将概述我们的情况:

我们陷入困境的库中的方法是executeRequest。 这种方法可以在https://github.com/adoy/PHP-OAuth2/blob/master/src/OAuth2/Client.php

的第404行找到(反讽)

现在,就像我说的那样,我对PHP的经验很少,所以我的调试方法只是在脚本中的给定点回显变量的状态。 尽管可能是业余的,但我至少可以验证url和参数是否正确。我可以打印完整的URL(伪参数值ofc):

  

注意以下使用的参数:coderedirect_uri,   grant_typen client_idclient_Secret

     

https://oauth.smartschool.be/OAuth/index/token?code=irsyB0VSmg4V5dVjHFgdl85iRvvu3gYpsuIE4cOk&redirect_uri=https%3A%2F%2Fmycallbackurl.com%2Fmy-page%2F&grant_type=authorization_code&client_id=5d6t5ev5a6d8&client_secret=pada9c54a6sc

执行此请求时,您将收到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”:“ X5s1aq56xaq6bhz56aGY6SC>

问题是,当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 = true
  • CURLOPT_SSL_VERIFYPEER = false
  • CURLOPT_SSL_VERIFYHOST = false
  • CURLOPT_CUSTOMREQUEST ='POST'
  • CURLOPT_POST = true
  • CURLOPT_POSTFIELDS =网址编码的参数字符串

示例: 代码= irsyB0VSmg4V5dVjHFgdl85iRvvu3gYpsuIE4cOk&redirect_uri = https%3A%2F%2Fmycallbackurl.com%2Fmy-page%2Fgrant_type = authorization_code&client_id = 5d6t5ev5a6d8&client_secret = pad

在执行如下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()数组:

  

Array([url] => https://oauth.smartschool.be/OAuth/index/token   [content_type] => application / 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   [upload_content_length] => 216 [starttransfer_time] => 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] => xxxxx [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] => application / json)

是否可以通过该curl请求打印参数/发布字段/正文,以验证是否已发送所有信息?

-编辑2:

使用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不接受参数。如果您想出其他一些可能的解决方案,请随时添加它们。谢谢您的转储链接,这真的很有用!

1 个答案:

答案 0 :(得分:5)

在浏览器中进行的测试与实际代码之间存在差异:在浏览器中,将变量作为 GET 参数传递,而在代码中发送 POST 身体。

要调试此类问题,我经常发现在使用PHP之前使用CLI curl更容易。当我这样发送请求时(注意Content-Type标头),我设法获得了肯定的结果:

curl -X POST --data "code=irsyB0VSmg4V5dVjHFgdl85iRvvu3gYpsuIE4cOk&redirect_uri=https%3A%2F%2Fmycallbackurl.com%2Fmy-page%2F&grant_type=authorization_code&client_id=5d6t5ev5a6d8&client_secret=pada9c54a6sc" "https://oauth.smartschool.be/OAuth/index/token" -H "Content-Type: application/x-www-form-urlencoded"
{"error":"error_occured","error_description":"Client authentication failed."}

当我强制发送没有此标头的请求时,我能够重现您的错误。这实际上并不是那么容易,因为使用--data会自动添加它:

curl -X POST --data "code=irsyB0VSmg4V5dVjHFgdl85iRvvu3gYpsuIE4cOk&redirect_uri=https%3A%2F%2Fmycallbackurl.com%2Fmy-page%2F&grant_type=authorization_code&client_id=5d6t5ev5a6d8&client_secret=pada9c54a6sc" "https://oauth.smartschool.be/OAuth/index/token" -H "Content-Type: "
{"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 \u0022grant_type\u0022 parameter."}

您需要确保您的代码发送了带有以下标头的请求:Content-Type: application/x-www-form-urlencoded

我猜想PHP-curl也会在使用POST(FIELDS)时隐式添加它(类似于CLI版本),您的问题可能是您“强制”设置了{{1 }}为空数组,然后将其删除。

要调试正在发送的标头,您可以使用:

CURLOPT_HTTPHEADER

编辑:

实际上甚至可以调试的更好的方法是在 POST 转到 https://httpbin.org/post 的地方更改OAuth-URL。这将只是镜像发送给它的所有内容,因此转储您收到的响应,它应类似于:

curl_setopt($ch, CURLINFO_HEADER_OUT, true);
// curl_exec
$information = curl_getinfo($ch);
print_r($information);

您可以希望识别从那里(而不是从那里)发送的内容,包括正文数据。不幸的是,Array ( [result] => Array ( [args] => Array ( ) [data] => [files] => Array ( ) [form] => Array ( [client_id] => 5d6t5ev5a6d8 [client_secret] => pada9c54a6sc [code] => irsyB0VSmg4V5dVjHFgdl85iRvvu3gYpsuIE4cOk [grant_type] => authorization_code [redirect_uri] => https://mycallbackurl.com/my-page ) [headers] => Array ( [Accept] => */* [Connection] => close [Content-Length] => 180 [Content-Type] => application/x-www-form-urlencoded [Host] => httpbin.org ) [json] => [origin] => 217.***.***.*** [url] => https://httpbin.org/post ) [code] => 200 [content_type] => application/json ) 的详细模式都没有显示出来。