6

Yammer ( https://www.yammer.com/api_doc.html ) への単純な API 要求を行う際に問題があります。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

しかし、次は何ですか?この番号はどこに入力すればよいですか? 必要なリクエストを実行する方法は?

ありがとう。ローマン

4

1 に答える 1

6

おそらく、認証ステップの後に取得する番号は、ACCESS トークンを取得するために REQUEST トークンと共に送信する必要があるoauth_verifier文字列です。

これは、oAuth 1.0a 実装の必須部分です (2.0 はまだドラフトであり、それを実装するライブラリは多くないため、現在使用されている最も一般的な実装だと思います)。

あなたはプロバイダーにコールバック URL を送信していないと思いますが、彼は承認後にユーザーをどこにリダイレクトすればよいかわかりません。プロバイダーがコールバック URL を知らない場合、ユーザーを (コンシューマー) アプリケーションにリダイレクトすることはできません。その場合、仕様ではベリファイア文字列を画面に出力する必要があると記載されているため、ユーザー (ユーザー) はそれを手動で取得して (コンシューマー) アプリケーションに渡し、ACCESS TOKEN の要求を作成できます。

(REQUEST トークンの最初のリクエストで) コールバック URL を提供した場合、ほとんどの場合、この番号が表示された画面は表示されませんが、代わりに、ユーザー (ユーザー) はコールバック URL に自動的にリダイレクトされます。

たとえば、コールバック URL が:http://myapp.com/oauth/callbackの場合、プロバイダーはクエリ文字列に適切な値を指定して、ユーザーをコールバック URL にリダイレクトします。

リダイレクト:http://myapp.com/oauth/callback?oauth_token=xxxx&oauth_verifier=yyyy

次に、アプリケーションは検証文字列を取得し、パラメーターとして ACCESS TOKEN の要求に追加する必要があります (以前に nonce、timestamp、oauth_token などの他のパラメーターで行ったように)。

この最後のリクエスト ( oauth_verifier文字列を含む) への応答として、ACCESS TOKEN を取得する必要があります。

これは、 oauth_verifier文字列と、それがプロトコルに導入された理由 に関する適切な説明です: http://hueniverse.com/2009/04/explaining-the-oauth-session-fixation-attack/

于 2011-03-09T15:16:02.027 に答える