Почему мои попытки использовать расширенную аутентификацию API Vimeo с использованием Perl's Net::OAuth не увенчались успехом?

Я пробовал два разных подхода к расширенной аутентификации API vimeo. Пожалуйста, найдите ниже оба: -

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>

Используемый выше потребительский ключ является действительным (не общим, хотя и сверху). При нажатии на указанный выше URL-адрес поиска непосредственно в браузере Mozilla выдается эта ошибка: «Переданная oauth_signature недействительна». Подскажите, пожалуйста, где именно в коде ошибка. Я следовал спецификации oauth, представленной по адресу: http://vimeo.com/api/docs/oauth

2-й подход:

#!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, я не могу двигаться дальше. Любые входные данные высоко ценятся.


person Ashwini Singh    schedule 02.05.2012    source источник
comment
В вашем первом подходе у вас есть use URI::Escape;"http://vimeo.com/api/rest/v2/"   -  person Sinan Ünür    schedule 02.05.2012


Ответы (3)


Это слишком долго для комментария, поэтому я публикую его как ответ, но на самом деле это не ответ (только косвенно связанный с тем, что вы полагаетесь на одноразовый номер как на механизм безопасности). Тем не менее, информация актуальна, поэтому я делаю ее вики сообщества. ХТН.

Я заметил, что у вас есть:

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

Для получения дополнительной информации см. сообщение в моем блоге Не оставляйте случайность на волю случая (или избегайте использования ранда, если это имеет значение).

person Community    schedule 02.05.2012

Когда я попытался скомпилировать ваш второй скрипт, я сначала получил:

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.

Я не могу провести живое тестирование, потому что у меня ничего не настроено для доступа к API Vimeo, но предупреждение от Net::OAuth::SignatureMethod::HMAC_SHA1 указывает на то, что где-то там, вероятно, есть еще одна опечатка.

Похоже, вам действительно нужно подписать свой запрос после его создания:

$request->sign;
person Sinan Ünür    schedule 02.05.2012
comment
Извините за опечатку. Теперь я исправил то же самое. Я пробовал несколько вариантов, но не добился успеха. Я также пытался выполнить запрос потребителя, но это также не дало той же ошибки подписи oauth. - person Ashwini Singh; 03.05.2012

В первом подходе вы использовали мой $oauth_signature = $hmac->b64digest; вместо $hmac->b64digest используйте $hmac->digest, это сработает.

person Uttam Kumar Agarwal    schedule 13.10.2016