Понимание oAuth с помощью Perl - PullRequest
6 голосов
/ 09 марта 2011

У меня проблема с выполнением простого запроса API к Yammer (https://www.yammer.com/api_doc.html). Мне нужно получить https://www.yammer.com/api/v1/groups.xml (Группы: список групп).

Я пытаюсьиспользовать Net :: OAuth :: Simple. Вот мой Yammer.pm:

package Yammer;
use strict;
use base qw(Net::OAuth::Simple);
sub new {
    my $class  = shift;
    my %tokens = @_;
    return $class->SUPER::new( tokens => \%tokens, 
        urls   => {
             authorization_url => "https://www.yammer.com/oauth/authorize",
             request_token_url => "https://www.yammer.com/oauth/request_token",
             access_token_url  => "https://www.yammer.com/oauth/access_token",
        },
        protocol_version => '1.0a',
    );
}
sub view_restricted_resource {

    my $self = shift;
    my $url  = shift;
    return $self->make_restricted_request( $url, 'GET' );
}
sub update_restricted_resource {

    my $self         = shift;
    my $url          = shift;
    my %extra_params = @_;
    return $self->make_restricted_request($url, 'POST', %extra_params);    
}

1;

А вот моя основная программа:

use Yammer;

# Get the tokens from the command line, a config file or wherever 
my %tokens  = (

    consumer_key => 'Baj7MciMhmnDTwj6kaOV5g',
    consumer_secret => 'ejFlGBPtXwGJrxrEnwGvdRyokov1ncN1XxjmIm34M',
    callback => 'https://www.yammer.com/oauth/authorize',

); 
my $app     = Yammer->new(%tokens);
# Check to see we have a consumer key and secret
unless ($app->consumer_key && $app->consumer_secret) {
    die "You must go get a consumer key and secret from App\n";
} 

# If the app is authorized (i.e has an access token and secret)
# Then look at a restricted resourse
if ($app->authorized) {
    my $response = $app->view_restricted_resource;
    print $response->content."\n";
    exit;
}
# Otherwise the user needs to go get an access token and secret
print "Go to " . $app->get_authorization_url( callback => 'https://www.yammer.com/oauth/authorize?rand=' . rand() ) . "\n";
print "Then hit return after\n";
<STDIN>;
my ($access_token, $access_token_secret) = $app->request_access_token($_);

Я получаю сообщения типа

Перейдите на https://www.yammer.com/oauth/authorize?oauth_token=2sxBkKW1F1iebF2TT5Y7g&callback=https%3A%2F%2Fwww.yammer.com%2Foauth%2Fauthorize%3Frand%3D0.0045166015625

И авторизуете приложение по этому URL. После этого я вижу сообщение вроде:

Вы успешно авторизовали следующееПриложение: 2GIS_yammer

Чтобы завершить авторизацию, вернитесь в приложение 2GIS_yammer и введите следующий код:

869A

Но что дальше? Где я должен ввести этономер? Как выполнить запрос мне нужно?

Спасибо. Роман

1 Ответ

6 голосов
/ 09 марта 2011

вероятно, число, которое вы получите после шага авторизации, является строкой oauth_verifier , которую необходимо отправить вместе с токеном REQUEST для получения токена ACCESS.

Это обязательная частьРеализации oAuth 1.0a (которые, на мой взгляд, являются наиболее распространенной реализацией, используемой в настоящее время, потому что 2.0 все еще является черновиком и не так много библиотек, которые его реализуют).

Я полагаю, что вы не отправляете URL обратного вызовапровайдеру, и он не знает, куда перенаправить пользователя после авторизации.Когда поставщик не знает URL-адрес обратного вызова, он не может перенаправить пользователя обратно в ваше (потребительское) приложение.В этом случае спецификация гласит, что она должна напечатать строку верификатора на экране, чтобы вы (пользователь) могли взять ее вручную и передать в свое (потребительское) приложение, и, таким образом, построить запрос на ACCESS TOKEN.

Если вы действительно предоставите URL обратного вызова (в первом запросе токена REQUEST), то, скорее всего, вы не получите экран с этим номером, но вместо этого вы (пользователь) будете перенаправлены на URL обратного вызова с ним автоматически.

Например, если ваш URL обратного вызова: http://myapp.com/oauth/callback, тогда провайдер перенаправит пользователя на ваш URL обратного вызова с правильными значениями в строке запроса.

redirect: http://myapp.com/oauth/callback?oauth_token=xxxx&oauth_verifier=yyyy

Тогда ваше приложение должно взять строку верификатора и добавить ее в качестве параметра в запрос на ACKESS TOKEN (как вы делали это ранее с другими параметрами, такими как nonce, timestamp, oauth_token и т. Д.)

В ответ на этот последний запрос (включая строку oauth_verifier ) вы должны получить ACKESS TOKEN.

Вот хорошее объяснение о строке oauth_verifier и почему она была введена в протокол: http://hueniverse.com/2009/04/explaining-the-oauth-session-fixation-attack/

...