我正在使用第三方服务,要求我通过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实现的常见问题:
如果我转出我得到的标题:
[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数据,但要将其保留为授权标题,但却找不到这样做的神奇方法!
答案 0 :(得分:0)
我见过这个。在fetch()中,尝试对$数组进行urlencoding并将其作为字符串形式传递:
rid=[restaurantId]&datetime=[datetime]&...
同时给出标题(fetch()的最后一个参数):
Content-Type: application/x-www-form-urlencoded