リクエストを行うために 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 実装に関する以前の一般的な問題についても言及しました。
- メソッドが GET から POST に変更されると、PHP HTTP lib はクエリ文字列をドロップします。
- PHP oAuth lib は、クエリ文字列またはその両方ではなく、投稿データを使用してリクエストに署名します。
ヘッダーをダンプすると、次のようになります。
[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 データを削除する必要があると思いますが、それを認証ヘッダーとして保持しますが、それを行う魔法の方法が見つかりません!