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}
あなたは正確に 'uri_escape'をしようとしていますか? '$ request {$ _}'はハッシュリファレンスであり、一般的にはストリング化したいものではありません。 – tjd
ええ、私はuri_escapeは必要ないと思います。私が次の例では、HMACパッケージを使用してGETリクエストのシグネチャを作成する機能を使用していますが、この特定のQuickbooks APIコールに対してPOSTを使用しています。文字列がどのように生成されるのか、私には分かりませんが、要求がoauth署名の一部でなければならないとわかっているからです。私がやろうとしているものと比較して動作する例を追加します。 – rwfitzy
実際の例では、メソッド、ホスト、およびクエリ文字列のHTTPリクエストを構成する要素からシグネチャが構築されています。あなたは '$ req'をビルドするために'%request'をどのように使っていますか? –