为什么我尝试使用Vimeo';使用Perl';OAuth失败了吗?

为什么我尝试使用Vimeo';使用Perl';OAuth失败了吗?,perl,oauth,vimeo,Perl,Oauth,Vimeo,我尝试了两种不同的方法来执行vimeo高级api身份验证。请参阅以下两项:- 第一次进近: #!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 = "CONSUMERK

我尝试了两种不同的方法来执行vimeo高级api身份验证。请参阅以下两项:-

第一次进近:

#!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>
#!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 Unauthorized”,在点击浏览器上的url时抛出相同的“无效oauth签名错误”。由于这家伙在Net::Oauth的第一步中抛出了错误,所以我无法继续。非常感谢您的任何意见。

这对于评论来说太长了,所以我将其作为一个答案发布,但它实际上并不是一个答案(只是因为您依赖nonce作为一种安全机制,所以与此无关)。然而,这些信息是相关的,所以我把它变成了一个社区维基。嗯

我注意到你有:

my $oauth_nonce  = int( rand( 2**32 ) ) ;
你好像在窗户上。您不应该使用内置的
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 32768
有关更多信息,请参阅我的博文。

当我试图编译您的第二个脚本时,我首先得到:

全局符号“$key”要求在C:\temp\tt.pl第24行显示包名。

修复后,我得到:

在C:/opt/Perl/site/lib/Net/OAuth/SignatureMethod/HMAC_SHA1.pm第18行的字符串eq中使用未初始化值。
无法验证!检查OAuth参数。

我无法进行实时测试,因为我没有任何设置来访问Vimeo API,但是来自
Net::OAuth::SignatureMethod::HMAC_SHA1
的警告表明可能还有另一个输入错误

看起来您实际上需要在创建请求后对其进行签名:

$request->sign;

在第一种方法中,您使用了我的
$oauth\u签名=$hmac->b64digest

与其使用
$hmac->b64digest
不如使用
$hmac->digest
,它将起作用。

在您的第一种方法中,您有
使用URI::Escape;"http://vimeo.com/api/rest/v2/“
很抱歉输入错误。现在,我已经纠正了同样的错误。我尝试了多种选择,但没有取得任何成功。我也尝试过做一个消费者请求,但这也无法说明相同的oauth签名无效错误。