生成基本OAuth标头

时间:2014-06-08 00:19:16

标签: php xml api rest oauth

我正在尝试了解如何使用使用OAuth库的TradeKing API发布数据。在与API支持专家交谈后,他解释说唯一缺少的是完成请求所需的OAuth标头。

我对OAuth的体验非常有限,官方文档中没有一个POST PHP示例。感谢您提供有关如何成功生成适用于API的OAuth标头的任何帮助。

我尝试在下面的代码中提供以下URL中的示例,但是,似乎它已被折旧,并且最新版本中缺少示例中使用的所有内置函数:

https://gist.github.com/JCBarry/2853042

提前致谢!

官方POST文档

https://developers.tradeking.com/documentation/accounts-id-orders-post

这就是我的尝试:

    <?php
      // Your keys/secrets for access
      $consumer_key     = '0cc175b9c0f1b6a831c399e269772661';
      $consumer_secret  = 'ff2513194e75315625628304c9eb66e8';
      $access_token     = '150a96573adf12b21dab621e85497e6e';
      $access_secret    = '5c7b57d450a71d378a5eda991f809e56';

      $oauth = new OAuth($consumer_key,$consumer_secret,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_AUTHORIZATION);
        $oauth->disableSSLChecks(); 
        $oauth->setToken($access_token,$access_secret);


        $url = 'https://api.tradeking.com/v1/accounts/12345678/orders/preview.xml';
        $data = '<?xml version="1.0"?>
        <FIXML xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2">
        <Order TmInForce="0" Typ="1" Side="1" Acct="12345678">
        <Instrmt SecTyp="CS" Sym="F"/>
        <OrdQty Qty="1"/>
        </Order>
        </FIXML>';


        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

        echo $response = curl_exec($ch);
    ?>

这是我得到的错误:

Error AuthenticationFailure signature_method_rejected /v1/accounts/12345678/orders/preview.xml

3 个答案:

答案 0 :(得分:1)

根据API,您需要发送一个类似于此

的Authorization标头
/*
Authorization: OAuth
  oauth_consumer_key="672e71387c0a126f4e13296ecfb2b7bc",
  oauth_nonce="cfdb7f42de425d94fbc24c11a920c33e",
  oauth_signature="Vfm148kAgBZ6azEHqds43aY2UsEg3D",
  oauth_signature_method="HMAC-SHA1",
  oauth_timestamp="1306871932",
  oauth_token="819682555b63ab8bd90a4138138e7365",
  oauth_version="1.0"
*/

尝试以下代码。您需要定义$oauth_nonce$oauth_signature

$header = [
    "Authorization: OAuth \n" .
    'oauth_consumer_key="'.$consumer_key.'"' . " \n" .
    'oauth_nonce="'.$oauth_nonce.'"' .  " \n" .
    'oauth_signature="'.$oauth_signature.'"' . " \n" .
    'oauth_signature_method="HMAC-SHA1"' . " \n" .
    'oauth_timestamp="'.time().'"' . " \n" .
    'oauth_token="'.$access_token.'"' . " \n" .
    'oauth_version="1.0"'
];

curl_setopt($ch, CURLOPT_HTTPHEADER, $header);

答案 1 :(得分:1)

他们的API看起来很好记录,然后我就无法理解你的问题了。

例如Request Structure

  

<强>接头

     

对于经过身份验证的呼叫,我们要求您通过有效的OAuth标头发送。对于未经身份验证的请求,没有任何必需的标头。

在您提供的代码示例中,这些标头完全缺少您使用curl_exec()触发的HTTP请求。所以你的例子根本不会起作用,如果会想知道。

然而,想知道您首先使用OAuth extension,然后使用Curl extension。这是两个不同的概念。他们并没有神奇地一起工作。

所以对我来说,你很可能看起来还没有决定你真正想要编程的东西(按行),我建议你抛弃代码,因为它只是以你自己的方式站立。

首先从头开始研究OAuth是什么,要使用哪个Oauth和HTTP客户端库,以及如何使用您在问题中引用的基于OAuth的API。由于您尝试使用的API已经有很好的文档记录,因此我确信您应该能够立即提出一个具体的编程问题,这个问题应该不那么模糊,因此很容易回答。

答案 2 :(得分:1)

要使其正常工作,首先必须获得oauth令牌。这是一个可行的代码:

// Change this! Use the right values!
$consumer_key     = '0cc175b9c0f1b6a831c399e269772661';
$consumer_secret  = 'ff2513194e75315625628304c9eb66e8';
$access_token     = '150a96573adf12b21dab621e85497e6e';
$access_secret    = '5c7b57d450a71d378a5eda991f809e56';

try {
    $oauth = new OAuth($consumer_key,$consumer_secret);
    $oauth->setToken($access_token,$access_secret);
    $access_token_info = $oauth->getAccessToken("https://developers.tradeking.com/oauth/request_token");
    if(!empty($access_token_info)) {
        print_r($access_token_info);
    } else {                       
        print "Failed fetching access token, response was: " . $oauth->getLastResponse();
    }
} catch(OAuthException $E) {
    echo "Response: ". $E->lastResponse . "\n";

如果一切正常,你会得到这样的回复:

Array
(
    [oauth_token] => some_token
    [oauth_token_secret] => some_token_secret
    [...extra data here...]

)

使用此信息,您可以在发出curl请求之前设置所需的OAuth标头:

    $ch = curl_init($url);
    $header = [...]; // Fill this array with info store in $access_token_info variable
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

    echo $response = curl_exec($ch);