2017-08-08 12 views
-1

oauthシグニチャを作成する方法の例が見つかりましたが、多次元ハッシュに問題があります。oauth署名のPerlハッシュ

$VAR1 = { 'Invoice' => { 'Line' => [ { 'Id' => '1', 'SalesItemLineDetail' => { 'ItemRef' => { 'value' => 'SKM2267' }, 'UnitPrice' => '10.00' }, 'DetailType' => 'SalesItemLineDetail', 'LineNum' => 1 }, { 'Id' => '2', 'SalesItemLineDetail' => { 'ItemRef' => { 'value' => 'SKM2292' }, 'UnitPrice' => '20.00' }, 'DetailType' => 'SalesItemLineDetail', 'LineNum' => 2 }, { 'Id' => '3', 'SalesItemLineDetail' => { 'ItemRef' => { 'value' => 'SKM2285' }, 'UnitPrice' => '30.00' }, 'DetailType' => 'SalesItemLineDetail', 'LineNum' => 3 } ], 'DocNumber' => '90210', 'CustomerRef' => \{ 'name' => 'Amazon.com', 'value' => 1 } } }; 

署名を作成する例文字列に上記の%要求ハッシュを結ぶ含まれます:

my $string = join('&',map {$_ . '=' . uri_escape($request{$_})} sort keys %request); 

しかし、私のハッシュは%要求と呼ばれる私のハッシュを表示するためのデータ:: Dumperのを使用して、このようになります。私は私のOAuth署名文字列に渡す必要がある文字列を作成するには、このハッシュを扱うことができますどのように

Invoice=HASH%280x7f254c17b540%29 

:これは、署名として使用するには一貫性がありません、以下を生成しますか?

my $hmac = Digest::HMAC_SHA1->new($e->{params}{qbo_consumer_secret} . '&' . $e->{params}{qbo_access_token_secret}); 
$hmac->add('POST&' . uri_escape($server) . '&' . uri_escape('oauth_consumer_key=' . $e->{params}{qbo_consumer_key}) . '&oauth_nonce=' . $nonce . '&oauth_signature_method=HMAC-SHA1&oauth_timestamp=' . $time . '&oauth_token=' . $e->{params}{qbo_access_token} . '&oauth_version=1.0' . '&' . join('&',map {$_ . '=' . uri_escape($request{$_})} sort keys %request)); 

その後の要求は、この許可ヘッダーが含まれています。私がしようとしていますに比べて

my $hmac = Digest::HMAC_SHA1->new($e->{params}{qbo_consumer_secret} . '&' . $e->{params}{qbo_access_token_secret}); 
$hmac->add('GET&' . uri_escape('https://sandbox-quickbooks.api.intuit.com/v3/company/' . $company_id . '/query') . '&' . uri_escape('oauth_consumer_key=' . $consumer_key . '&oauth_nonce=' . $nonce . '&oauth_signature_method=HMAC-SHA1&oauth_timestamp=' . $time . '&oauth_token=' . $access_token . '&oauth_version=1.0' . '&' . join('&',map {$_ . '=' . uri_escape($params{$_})} sort keys %params))); 

正常に動作スクリプトの例では、OAuthの署名を構築するために、以下の使用しています:

my $req = HTTP::Request->new(POST => $server); 
$req->header(Authorization => 
    'OAuth oauth_consumer_key="' . $e->{qbo_consumer_key} 
    . '",oauth_nonce="' . $nonce 
    . '",oauth_signature="' . encode_base64($hmac->digest) 
    . '",oauth_signature_method="HMAC-SHA1' 
    . '",oauth_timestamp="' . time(); 
    . '",oauth_token="' . $e->{qbo_access_token} 
    . '",oauth_version="1.0' 
    . '"'); 
$req->content(\%request); 

さらに、ハッシュをjsonに変換しようとすると 'can not e ncode参照スカラー '。私はこの簡単なテストスクリプトを試してみます:

#!/usr/bin/perl 

use strict; 
use warnings; 
use JSON; 

my %hash = { 'Invoice' => { 'Line' => [ { 'Id' => '1', 'SalesItemLineDetail' => { 'ItemRef' => { 'value' => 'SKM2267' }, 'UnitPrice' => '10.00' }, 'DetailType' => 'SalesItemLineDetail', 'LineNum' => 1 }, { 'Id' => '2', 'SalesItemLineDetail' => { 'ItemRef' => { 'value' => 'SKM2292' }, 'UnitPrice' => '20.00' }, 'DetailType' => 'SalesItemLineDetail', 'LineNum' => 2 }, { 'Id' => '3', 'SalesItemLineDetail' => { 'ItemRef' => { 'value' => 'SKM2285' }, 'UnitPrice' => '30.00' }, 'DetailType' => 'SalesItemLineDetail', 'LineNum' => 3 } ], 'DocNumber' => '90210', 'CustomerRef' => \{ 'name' => 'Amazon.com', 'value' => 1 } } }; 

my $js = encode_json \%hash; 
print "$js\n"; 

私のハッシュに何か問題がありますか?

Reference found where even-sized list expected at testjson.pl line 8. 
{"HASH(0x8db5f3c)":null} 
+0

あなたは正確に 'uri_escape'をしようとしていますか? '$ request {$ _}'はハッシュリファレンスであり、一般的にはストリング化したいものではありません。 – tjd

+0

ええ、私はuri_escapeは必要ないと思います。私が次の例では、HMACパッケージを使用してGETリクエストのシグネチャを作成する機能を使用していますが、この特定のQuickbooks APIコールに対してPOSTを使用しています。文字列がどのように生成されるのか、私には分かりませんが、要求がoauth署名の一部でなければならないとわかっているからです。私がやろうとしているものと比較して動作する例を追加します。 – rwfitzy

+0

実際の例では、メソッド、ホスト、およびクエリ文字列のHTTPリクエストを構成する要素からシグネチャが構築されています。あなたは '$ req'をビルドするために'%request'をどのように使っていますか? –

答えて

0

あなたはJSONモジュールのドキュメントを読むのであれば、まず、それは非常に明確にencode方法はだけなので、それはハッシュが動作しません渡しスカラーを取ると述べています。そのようなハッシュを関数に渡すと、それぞれのキーと値が取り出され、別々に渡されます。

my %hash=("a" => 1,"b" => 2); 
my_func(%hash); 
# The above function call is the same as the one below 
my_func("b",2,"a",1); 

通常、ハッシュで見られるように、各キーと値の組み合わせはランダムです。それは、あなたのコードをテストしようとしたときに、それを使用する方法や少なくとも私がインストールしたバージョンを伝えるエラーを投げるべきでもあります。

代わりにあなたが実際にやってみたいことは、この

$json->encode(\%request); 

のようなハッシュリファレンスを渡している返す値は、あなたが$req->content()に渡すと署名に使用するために必要なものです。あなたがJSONデータをそのまま渡すか、それをCGIパラメータの値として使用するかどうかを知るために、Quickbooks APIのことはわかりません。それは私が望むドキュメントであなたに伝えるものでなければなりません。

+0

実際、$ js = $ json-> encode(\%要求)を試しました。このエラーを取得します。スカラーへの参照をエンコードできません。私は上記を追加します。 – rwfitzy

+0

@rwfitzyあなたはハッシュを間違って作成しています - 最も外側のハッシュは中かっこではなくかっこで作成されます。ハッシュを作成する方法の例については私の答えを見てください。内側のものは、 –

関連する問題