2

我正在使用第三方服务,该服务要求我通过 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. 一旦方法从 GET 更改为 POST,PHP HTTP 库将删除查询字符串。
  2. PHP oAuth 库将使用发布数据对请求进行签名,而不是使用查询字符串或两者兼而有之。

如果我转储标题,我会得到:

[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 标头中发送它(它也在发送)

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 数据,但将其保留为授权标头,但找不到这样做的神奇方法!

4

1 回答 1

0

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

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

还要给出标题(fetch() 的最终参数):

Content-Type: application/x-www-form-urlencoded
于 2013-07-24T13:31:46.417 回答