6

APIへの認証を試みるときにPECLOAuthを使用しています。

サンプルコード:

<?php

$requestUri = 'http://openapi.lovefilm.com/oauth/request';

$consumerKey = 'MYCONSUMERKEY'; 
$consumerSecret = 'MYSECRET';

$oauth = new OAuth($consumerKey, $consumerSecret);

$oauth->setAuthType(OAUTH_AUTH_TYPE_AUTHORIZATION);
$oauth->setVersion('1.0');
$oauth->setTimestamp(mktime());


$oauth->enableDebug();

try
{
    $req = $oauth->getRequestToken($requestUri, 'oob');
    var_dump($req);
}
catch(OAuthException $e)
{
    print '<pre>';
    var_dump($e);

    var_dump($oauth->debugInfo);
}

?>

彼らが提供する仕様(http://developer.lovefilm.com/ --registration req)には、以下のようなリクエストをPOSTする必要があると書かれています。

POST /oauth/request_token HTTP / 1.1ホスト:openapi.lovefilm.com認証:OAuth oauth_callback = "http%3A%2F%2Fyour-service.com%2Fsuccess"、oauth_consumer_key = "2blu7svnhwkzw29zg7cwkydn"、oauth_nonce = "5f38dbc02a "sPSVmqN%2FXu9k0wlZxF0PqPZwYGo%3D"、oauth_signature_method = "HMAC-SHA1"、oauth_timestamp = "1278499295"、oauth_version = "1.0"

ただし、この方法を使用すると、次のようになります。

$oauth->setAuthType(OAUTH_AUTH_TYPE_AUTHORIZATION);

生成されるリクエストは常にGETです。

誰か助けてもらえますか?

ありがとう、

ベン

4

4 に答える 4

2

はい、OAuth仕様によると、一時的な資格情報のリクエスト(別名「リクエストトークン」)トークン資格情報のリクエスト(別名「アクセストークン」)はHTTPPOSTリクエストとして送信する必要がありますが、PECLOAuth拡張機能は永続的に使用しているようですGETforgetRequestToken()getAccessToken()...デフォルトで。

次のいずれかの値$auth_typeOAuth::__construct()受け入れるパラメータがあります。

  • OAUTH_AUTH_TYPE_AUTHORIZATIONAuthorization-リクエストのHTTPヘッダーでOAuthパラメータを送信します(GETデフォルトではリクエストを使用します)。
  • OAUTH_AUTH_TYPE_URI-リクエストURIでOAuthパラメータを送信します(つまり、GETリクエストのクエリパラメータ)。
  • OAUTH_AUTH_TYPE_FORM--HTTP POST本文の一部として(POSTリクエストで)OAuthパラメーターを送信します。
  • OAUTH_AUTH_TYPE_NONE--OAuthパラメータ、つまり「NoAuth」リクエストを送信しないでください(これもGETデフォルトです)。

私の経験から、、、、fetch()およびgetRequestToken()メソッドgetAccessToken()はすべてこの設定を尊重します。この設定は、オブジェクトのインスタンスで設定することもできます。OAuth::setAuthType()OAUTH_AUTH_TYPE_FORM実際には、ダンスの実行中に認証タイプをに設定してから、デフォルトにリセットしますOAUTH_AUTH_TYPE_AUTHORIZATION---リソース要求を行います。

于 2013-04-04T21:34:10.523 に答える
0

あなたが与えた例の投稿本文に何もないときに、彼らが特にPOSTを要求しているのは少し奇妙です!GETリクエストの場合は機能しますか?私は彼らの技術サポートにpingして、そこで何が起こっているのか尋ねたくなるでしょう。POSTが必要な場合は、PECLを使用するのではなく、手動でリクエストをアセンブルする必要があります。これは非常に可能ですが、非常に面倒です。

于 2010-11-11T12:34:00.927 に答える
0

これを修正する1つの方法は、andの代わりにを使用することOAuth::fetchです。OAuth::getRequestTokenOAuth::getAccessToken

$oauth = new OAuth('consumer_key', 'consumer_secret');
$oauth->fetch(
    'https://example.com/oauth/request_token', 
    array(), 
    OAUTH_HTTP_METHOD_POST
);
parse_str($oauth->getLastResponse(), $token_pair);
于 2013-05-06T14:21:58.747 に答える
0

使用OAUTH_AUTH_TYPE_FORMは回避策にすぎません。

Peclのoauth拡張バージョン1.2.3にはバグがあります; RFCが望むように、POSTの代わりにGETリクエストgetRequestTokenを使用します。getAccessToken

このバグを回避するOAUTH_HTTP_METHOD_POSTには、3番目のパラメーターをにgetRequestToken、4番目のパラメーターをに渡しますgetAccessToken。はい、これらのパラメータは文書化されていません


pecl/oauthのバージョン1.2.4はデフォルトでPOSTになります。

于 2014-07-21T09:41:22.867 に答える