OAuth GetRequestToken
OAuthGetRequestToken
準備段階で入手した"OAuth Consumer Key"と"OAuth Consumer Secret"をもとに、Tokenを取得します。
とりあえずCGIにしていますが、コンソールから実行でも問題ないです。なお、$callback_url には、AuthorizeTokenの際にアクセスすることになるCGIのURLをフルパスで入れておきます。
#!/usr/bin/perl
use LWP::UserAgent;
use Digest::HMAC_SHA1;
# OAuth Consumer Secret
my $consumer_sec = 'OAuth Consumer Secret';
# OAuth Consumer Key
my $consumer_key = 'OAuth Consumer Key';
# Callback URL 次に作るCGIへのパスを記入
my $callback_url = 'http://your.domain/path/callback.cgi';
# Requestを送るURL
my $url = 'https://www.google.com/accounts/OAuthGetRequestToken';
# URLへのMETHOD
my $method = 'GET';
# OAuth用パラメータ
my %oauth_param;
$oauth_param{oauth_consumer_key} = $consumer_key;
$oauth_param{oauth_callback} = $callback_url;
# 署名方法はHMAC-SHA1で。
$oauth_param{oauth_signature_method} = 'HMAC-SHA1';
# Scopeは、今回はURL Shortener
$oauth_param{scope} = 'https://www.googleapis.com/auth/urlshortener';
# タイムスタンプとか
$oauth_param{oauth_timestamp} = time();
$oauth_param{oauth_nonce} = int(rand(2**32)) . int(rand(2**32));
# Signature Base String の作成
my $signature_base = createSigBase($url, $method, \%oauth_param);
# Token Secretを未取得なので、署名キーは今回は '<OAuth Consumer Secret>&'
my $signature_key = url_encode($consumer_sec) . '&';
# Signature Base String を、key で署名してURLエンコードして署名を作成
my $signature = url_encode(hmac_sha1($signature_key, $signature_base));
# Authorization: ヘッダ情報の生成
my $auth_param = createAuthParam(\%oauth_param, $signature);
# 準備完了!リクエストの実行!!
my $res = LWP::UserAgent->new->request(
HTTP::Request->new(
$method,
$url,
HTTP::Headers->new('Authorization' => $auth_param)
)
);
# method決め打ちなら…。
# my $res = LWP::UserAgent->new->get($url, 'Authorization' => $auth_param);
# 結果発表~
print "Content-type: text/plain\n\n";
foreach my $pair (split(/&/, $res->content)) {
print url_decode($pair) . "\n";
}
# for Debug
# print $res->as_string; # For debug
exit;
# 以下の計算は今回は1回しか使わないけど、今後も使うのでサブルーチン化
# Signature Baseを作ります
sub createSigBase {
my ($url, $method, $ref_oauth_param) = @_;
my @sb = ();
foreach my $k (sort(keys(%$ref_oauth_param))) {
push(@sb, $k . '=' . url_encode($ref_oauth_param->{$k}));
}
my $param = join('&', @sb);
return join('&', ($method, url_encode($url), url_encode($param)));
}
# Authorization: ヘッダの内容を作ります
sub createAuthParam {
my ($ref_oauth_param, $sig) = @_;
my @op = ();
while (my ($key, $value) = each(%$ref_oauth_param)) {
push(@op, $key . "=\"" . $value . "\"");
}
push(@op, "oauth_signature=\"$sig\"");
return 'OAuth ' . join(', ', @op);
}
# hmac_sha1 署名。
sub hmac_sha1 {
my ($key, $msg) = @_;;
return Digest::HMAC_SHA1->new($key)->add($msg)->b64digest . '=';
}
# URL エンコード
# http://www.din.or.jp/~ohzaki/perl.htm#JP_Escape を参考にしました。
sub url_encode {
$_ = shift;
s/([^a-zA-Z0-9_.!~*'()-])/'%' . uc(unpack('H2', $1))/eg;
return $_;
}
# URL デコード
# http://www.din.or.jp/~ohzaki/perl.htm#JP_Escape を参考にしました。
sub url_decode {
$_ = shift;
s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
return $_;
}上のCGIを実行して、↓みたいなの返ってきたら成功!
oauth_token=hoge oauth_token_secret=fuga oauth_callback_confirmed=true
hogeとかfugaとかは実際もうちょっと長いです。次で使うので、内容をメモるか、画面を消さずにおいてコピペしてください。