PerlでOAuthしてみた

OAuth::Lite::ConsumerTwitter. It's what's happening. OAuthを使ってみた。

what's OAuth

An open protocol to allow secure API authorization in a simple and standard method from desktop and web applications.
OAuthはオープンプロトコルであり、デスクトップ、WebアプリケーションなどにセキュアなAPI認可 (authorization) の標準的手段を提供します。

特徴

  • APIの接続確認にトークンを使用する
  • そのトークンは、ユーザの同意に基づいてサービスプロバイダからコンシューマへ付与される

認証までの流れは、以下のブログを参照ください。(個人的には、とても分かりやすかったです。)
twitterでOAuthを使う方法(その1:認証まで): てっく☆ゆきろぐ

今回作ったもの

Twitter. It's what's happening. OAuthを使い、現在時刻をつぶやくサンプルアプリを作成しました。
構成は以下の通り。

    • index.html: サンプルアプリのトップページ(request.cgiへのリンク)
    • request.cgi: request tokenの取得からサービスプロバイダへのリダイレクト
    • callback.cgi: コールバック、アクセストークン取得、つぶやきのポスト

プログラム

事前準備として、Twitterでのアプリケーション登録(consumer_key/consumer_secretの取得)が必要です。

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use OAuth::Lite::Consumer;
use URI;
use CGI;

my $q = CGI->new();
$q->charset('utf-8');

my $consumer = OAuth::Lite::Consumer->new(
    consumer_key => '事前に取得したconsumer_key', 
    consumer_secret =>  '事前に取得したconsumer_secret',
    site => 'http://twitter.com/',
    request_token_path => 'http://twitter.com/oauth/request_token',
    access_token_path => 'http://twitter.com/oauth/access_token',
    authorize_path => 'http://twitter.com/oauth/authorize',
    callback_url => '事前に登録したCallback URL(callback.cgi)',
);

my $request_token = $consumer->get_request_token();
my $uri = URI->new('http://twitter.com/oauth/authorize');
$uri->query(
    $consumer->gen_auth_query('GET', 'http://twitter.com', $request_token)
);

print $q->redirect($uri->as_string);

exit;
#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use OAuth::Lite::Consumer;
use URI;
use CGI;
use JSON;

my $q = CGI->new();
$q->charset('utf-8');

my $consumer = OAuth::Lite::Consumer->new(
    consumer_key => '事前に取得したconsumer_key', 
    consumer_secret =>  '事前に取得したconsumer_secret',
    site => 'http://twitter.com/',
    request_token_path => 'http://twitter.com/oauth/request_token',
    access_token_path => 'http://twitter.com/oauth/access_token',
    authorize_path => 'http://twitter.com/oauth/authorize',
);

my $oauth_token = $q->param('oauth_token');
my $oauth_verifier = $q->param('oauth_verifier');

my $access_token = $consumer->get_access_token(
    token => $oauth_token,
    verifier => $oauth_verifier,
);

my $res = $consumer->request(
    method => 'POST',
    url => q{http://twitter.com/statuses/update.json},
    token => $access_token,
    params => {
        status => scalar localtime,
        token => $access_token,
    },
);

if ($res->is_success){
    my $status = from_json($res->decoded_content || $res->content);
    print $q->redirect('http://twitter.com/' . $status->{user}->{screen_name} . '/status/' . $status->{id});
} else {
    print $q->redirect('http://twitter.com/');
}

exit;