2012-05-02 22 views
1

我已經嘗試了兩種不同的方法來做到VIMEO先進的API認證。請看以下兩個: -爲什麼使用Perl的Net :: OAuth的失敗我在使用Vimeo的先進的API認證嘗試?

1方法:

#!perl 
use strict; 
use warnings; 

use Digest::HMAC_SHA1; 
use Data::Dump qw /dump/; 
use URI::Escape; 
use Net::OAuth; 
use MIME::Base64; 
use LWP::UserAgent; 

# Authorize a user 

my $consumer_key = "CONSUMERKEY"; 
my $secret  = "SECRET"; 
my $method  = "vimeo.videos.search" ; 
my $oauth_nonce = int(rand(2**32)) ; 
my $timestamp = time ; 
my $query  = "happy" ; 
my $url   = "http://vimeo.com/api/rest/v2/" ; 

my $str = "method=$method&oauth_consumer_key=$consumer_key&oauth_nonce=$oauth_nonce&oauth_signature_method=HMAC-SHA1&oauth_timestamp=$timestamp&oauth_version=1.0&query=$query"; 

$str = uri_escape($str) ; 
$url = uri_escape($url) ; 

my $secret_key = $secret . '&'; 
my $base_str = "GET" . "&" . $url . "&" . $str ; 

my $hmac = Digest::HMAC_SHA1->new($secret_key) ; 
$hmac->add($base_str) ; 

my $oauth_signature = $hmac->b64digest ; 
$oauth_signature = encode_base64($oauth_signature); 
chomp $oauth_signature; 
$oauth_signature = uri_escape($oauth_signature); 

my $v_search_url = "http://vimeo.com/api/rest/v2? method=$method&oauth_consumer_key=$key&oauth_nonce=$oauth_nonce&oauth_signature_method=HMAC-SHA1&oauth_timestamp=$timestamp&oauth_version=1.0&oauth_signature=$oauth_signature&query=$query" ; 

my $browser = LWP::UserAgent->new; 
my $res  = $browser->get($v_search_url); 
print $res->content; 

The response content throws following error:- 
<?xml version="1.0" encoding="UTF-8"?> 
<rsp generated_in="0.0024" stat="fail"> 
    <err code="401" expl="The consumer key passed was not valid." msg="Invalid consumer key"/> 
</rsp> 

上面使用的消費者密鑰是一個有效的(儘管在上面不共享)。在直接擊中的Mozilla瀏覽器上面的搜索URL拋出這個錯誤:「通過的oauth_signature是無效的。」 請讓我知道確切位置的代碼有錯誤。我已按照所提供的OAuth規範:http://vimeo.com/api/docs/oauth

第二個方法:

#!perl                                   

use strict; 
use warnings; 

use Digest::HMAC_SHA1; 
use Data::Dump qw /dump/; 
use URI::Escape; 
use Net::OAuth; 
use Net::OAuth::RequestTokenRequest; 
use MIME::Base64; 
use LWP::UserAgent; 

# Authorize a user                                  
my $consumer_key = "CONSUMERKEY"; 
my $secret  = "SECRET"; 
my $method  = "vimeo.videos.search" ; 
my $oauth_nonce = int(rand(2**32)) ; 
my $timestamp = time ; 
my $query  = "happy" ; 
my $url   = "http://vimeo.com/oauth/request_token"; 

my $request = Net::OAuth::RequestTokenRequest->new(
    consumer_key  => $consumer_key, 
    consumer_secret => $secret, 
    request_url  => $url, 
    request_method => 'GET', 
    signature_method => 'HMAC-SHA1', 
    timestamp  => $timestamp, 
    nonce   => $oauth_nonce, 
); 

die "COULDN'T GET REQUEST SIGN! Check parameters.\n" unless $request->sign; 
die "COULDN'T VERIFY! Check OAuth parameters.\n" unless $request->verify; 

my $browser = LWP::UserAgent->new; 
my $post_body = $request->to_post_body; 
$post_body = "oauth_callback=oob&" . $post_body; 
my $post_url = $url . '/?' . $post_body; 

my $res  = $browser->get($post_url); 

die $res->status_line unless ($res->is_success); 

print $res->content; 

這種方法也拋出上述錯誤消息:「401未授權」,雖然沒有打在瀏覽器的URL,它拋出的相同'無效的oauth簽名錯誤'。由於這個人在Net :: Oauth的第一步拋出錯誤,我無法繼續前進。任何投入都非常感謝。

+0

在你的第一種方法中,你有'使用URI :: Escape;「http:// vimeo。com/api/rest/v2 /「' –

回答

2

這是一個評論太長了,所以我張貼它作爲一個答案,但它確實不是一個答案(在你所依靠的隨機數作爲一種安全機制,只有切向有關)。但是,這些信息是相關的,所以我把它變成一個社區wiki。 HTH。

我注意到你有:

my $oauth_nonce = int(rand(2**32)) ; 

,你似乎是在Windows上。你不應該使用內置的rand(其中Perl的從C運行時需要),因爲以下的陷阱的:

#!/usr/bin/env perl 

use strict; use warnings; 

my %counts; 

for (1 .. 1_000_000) { 
    $counts{ int(rand(2**32))}++; 
} 

print scalar keys %counts, "\n"; 

輸出:

32768

欲瞭解更多信息,請參見我的博客文章Don't leave randomness to chance (or, avoid using rand if it matters)

0

當我試圖編譯你的第二個腳本,我第一次:

Global symbol "$key" requires explicit package name at C:\temp\tt.pl line 24.

固定在此之後,我得到了:

Use of uninitialized value in string eq at C:/opt/Perl/site/lib/Net/OAuth/SignatureMethod/HMAC_SHA1.pm line 18. COULDN'T VERIFY! Check OAuth parameters.

我不能做一個現場測試因爲我沒有什麼設置訪問Vimeo的API,但是從Net::OAuth::SignatureMethod::HMAC_SHA1警告表示有可能是另一種牛逼ypo在那裏某處。

它看起來像你的實際需要創建後簽上你的要求:

$request->sign; 
+0

對不起,我錯過了錯誤,現在我糾正了相同的錯誤,我嘗試了多個選項但沒有取得任何成功。相同的oauth簽名無效的錯誤。 –

0

在第一種方法你用過的我$oauth_signature = $hmac->b64digest; 代替$hmac->b64digest使用$hmac->digest,它會工作。

相關問題