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 lib はクエリ文字列をドロップします。
  2. 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 データを削除する必要があると思いますが、それを認証ヘッダーとして保持しますが、それを行う魔法の方法が見つかりません!

4

1 に答える 1

0

私はこれを見てきました。fetch() で、$array を urlencode して、次の形式の文字列として渡してみてください。

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

ヘッダー (fetch() の最終パラメーター) も指定します。

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