不要在POST变量中传递OAuth - PHP OAuth Pecl库

时间:2013-02-14 10:19:38

标签: php oauth

我正在使用第三方服务,要求我通过OAuth1进行身份验证以发出请求。我可以使用GET成功验证并通过大多数调用获取数据,但有些调用需要POST,这就是问题所在。要进行身份验证我使用以下内容:

$oauth = new OAuth(MY_KEY,MY_SECRET);
$oauth->setNonce(rand());    
$oauth->setToken('','');

然后,对于GET电话,我正在做类似下面的事情:

$array = array(
    'partnerId'=>'1234'
    );

$call = $oauth->fetch("https://domain.co.uk/api/getInfo/",$array);
$data = $oauth->getLastResponse();

这一切都很完美,我可以打印出$ data

然而,使用POST调用:

$oauth = new OAuth(MY_KEY,MY_SECRET);
$oauth->setNonce(rand());    
$oauth->setToken('','');
$oauth->enableDebug();
$oauth->setAuthType(OAUTH_AUTH_TYPE_AUTHORIZATION);

$array = array(
    'rid' => "$restaurantId",
    'datetime' => "$datetime",
    'partysize' => $covers,
    'timesecurityID' => "$securityId",
    'resultskey' => "$resultskey"
);

$call = $oauth->fetch("https://domain.co.uk/api/booking/?pid=1234&st=0",$array,OAUTH_HTTP_METHOD_POST);
$data = $oauth->getLastResponse();

我一直收到错误:Invalid Consumer Signature

对他们的技术人员说,他建议

  

您的sbs值表示您正在使用所有POST进行签名   参数,而您只需要使用查询字符串进行签名。在   在这种情况下,它将是“pid = 1234& st = 0”。不幸的是,我不是   熟悉PHP库并且没有任何关于如何的建议   改变行为。

并且还提到了PHP实现的常见问题:

  1. PHP HTTP lib将在方法完成后删除查询字符串 从GET更改为POST。
  2. PHP oAuth lib将使用发布数据 签署请求而不是查询字符串,或者两者都签名。
  3. 如果我转出我得到的标题:

    [sbs] => POST&https%3A%2F%2Fdomain.co.uk%2Fapi%2Fbooking%2F&datetime%3D2013-02-21T10%253A30%253A00%26oauth_consumer_key%3DMySiteV3TT%26oauth_nonce%3D1213111151%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1360835965%26oauth_token%3D%26oauth_version%3D1.0%26partysize%3D2%26pid%3D1531%26resultskey%3DfoqgEnYK%25252bIzRd6BV3T8eGQ%25253d%25253d%26rid%3D31852%26st%3D0%26timesecurityID%3D349367809
    [headers_sent] => POST /api/booking/?pid=1234&st=0 HTTP/1.1
    

    看起来它正在发送剩余帖子的OAuth数据,我只想在授权标题中发送它(它也在发送)

    Authorization: OAuth oauth_consumer_key="MySite",oauth_signature_method="HMAC-SHA1",oauth_nonce="1772854358",oauth_timestamp="1360768712",oauth_version="1.0",oauth_token="",oauth_signature="2%2B7xb%2BJ5cdbUDC5UHfsdfsNpFM1pE%3D"
    

    所以我认为我需要从发布请求中删除OAuth数据,但要将其保留为授权标题,但却找不到这样做的神奇方法!

1 个答案:

答案 0 :(得分:0)

我见过这个。在fetch()中,尝试对$数组进行urlencoding并将其作为字符串形式传递:

rid=[restaurantId]&datetime=[datetime]&...

同时给出标题(fetch()的最后一个参数):

Content-Type: application/x-www-form-urlencoded