はじめに
OpenIDは最近非常に注目が高まっている認証技術の一つです。ここでは、OpenIDを利用したPerlのサンプルを通じてOpenIDのメカニズムに触れていきたいと思います。
必要な環境
Perl 5.8以上が動作する環境が良いと思います。基本動作の確認はMac OS Xを利用しました
サンプルの紹介
早速サンプルコードの「openid-test.cgi」を見ることにしましょう。このサンプルはOpenIDを利用した簡易ログインページです。
#!/usr/bin/perl use strict; use warnings; use CGI; use Net::OpenID::Consumer; #use LWPx::ParanoidAgent; use LWP::UserAgent; my $query = CGI->new; $query->charset('utf-8'); my $csr = Net::OpenID::Consumer->new( #ua => LWPx::ParanoidAgent->new, ua => LWP::UserAgent->new, args => $query, consumer_secret => sub { $_[0] }, ); if ($query->param('openid-url')) { my $claimed_url = $query->param('openid-url'); use Data::Dumper; my $identity = $csr->claimed_identity($claimed_url) or show_login_form($query, 'wrong identity'.Dumper($csr)); my $check_url = $identity->check_url( return_to => URI->new($query->url.'?verify=1')->as_string, trust_root => $query->url, ); print $query->redirect(-uri => $check_url); } elsif ($query->param('verify')) { if (my $setup_url = $csr->user_setup_url) { print $query->redirect(-uri => $setup_url); } elsif ($csr->user_cancel) { show_login_form($query, 'You\'re cancelled.'); } elsif (my $identity = $csr->verified_identity) { my $user = +{ map { $_ => scalar $identity->$_ } qw( url display rss atom foaf declared_rss declared_atom declared_foaf foafmaker ) }; use Data::Dumper; print $query->header, 'logged in!!'."\n" .'<pre>'.Dumper($user).'</pre>'; } else { show_login_form($query); } } else { show_login_form($query); } sub show_login_form { my ($query, $message) = @_; $message = $message ? $message = "<p class='error'>$message</p>" : ''; print $query->header, <<PAGE; <html> <head> <title>login for OpenID</title> <link rel="stylesheet" type="text/css" href="/css/openid.css" /> </head> <body> <h1>Try OpenID</h1> $message <form action='openid-test.cgi' method='POST'> <b>Login with your blog URL:</b> <input name='openid-url' class='sexy' size='30' value="" /> <input type='submit' value='Login' /><br /> <i>For example: <tt>happygirl.bloghost.com</tt></i> </form> </body> </html> PAGE }
これだけでサンプルの実装は終わりです。とてもシンプルです。CPANモジュール「Net::OpenID::Consumer」が、OpenIDのプロトコルに関する実装を隠蔽してくれますので利用者は最小限のコードを実装するだけです。