Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

OpenIDを使ってみよう

Perlで理解するOpenIDのしくみ

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/06/08 14:00

OpenIDは最近非常に注目が高まっている認証技術の一つです。OpenIDを利用したサンプルを通じてOpenIDのメカニズムに触れていきたいと思います。

目次

はじめに

 OpenIDは最近非常に注目が高まっている認証技術の一つです。ここでは、OpenIDを利用したPerlのサンプルを通じてOpenIDのメカニズムに触れていきたいと思います。

必要な環境

 Perl 5.8以上が動作する環境が良いと思います。基本動作の確認はMac OS Xを利用しました

サンプルの紹介

 早速サンプルコードの「openid-test.cgi」を見ることにしましょう。このサンプルはOpenIDを利用した簡易ログインページです。

openid-test.cgi
#!/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のプロトコルに関する実装を隠蔽してくれますので利用者は最小限のコードを実装するだけです。


  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

バックナンバー

連載:Perl Tips
All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5