Plack::App::Directory::Markdown をベースにちょっと手を入れた Markdown ビューアを使っている(記事)んだけれど、閲覧要認証なシチュエーションが出てきた。
自分のみ閲覧のものは builder で Plack::Middleware::Auth::Digest を enable にして Digest 認証をかけ、htdigest コマンドでパスワード管理とかで済ませているのだけれど、複数人に閲覧してもらうのにこれは嫌だ。人のパスワード管理はしたくない。
OAuth で Google アカウントとかの認証を使うというのもあるけれどキーとか面倒くさいので、せっかくだし mixi OpenID を使うことにした。Perl モジュールは Net::OpenID::Consumer::Lite を使用。
とりあえずやっつけで以下のような感じ。いきなり mixi OpenID 認証させるしエラー・キャンセル処理もほとんどないし、call の中にネジこんだりしてあるので、まだまだダメダメだけれどとりあえず認証はできた。後で整理する。
$app = builder { enable 'Session', store => 'File'; $app; };
my $session = $env->{'psgix.session'}; my $request = Plack::Request->new($env); unless ($session->{openid}) { unless ($request->parameters->{'openid.mode'}) { my $check_url = Net::OpenID::Consumer::Lite->check_url( 'https://mixi.jp/openid_server.pl', $request->uri); return [302, ['Location' => $check_url], []]; } return Net::OpenID::Consumer::Lite->handle_server_response( $request->parameters => ( not_openid => sub { return [503, [], []]; }, setup_required => sub { my $setup_url = shift; return [302, ['Location' => $setup_url], []]; }, cancelled => sub { return [403, [], []]; }, verified => sub { my $vident = shift; my $identity = $vident->{identity}; # %member に閲覧 OK の OpenID を入れてある。 if (exists $member{$identity}) { $session->{openid} = $identity; return [302, ['Location' => $vident->{return_to}], []]; } else { return [403, [], []]; } }, error => sub { my $err = shift; return [503, [], []]; }, ) ); } # 以下は認証済みの場合の処理を書く。
[ Naney と mixi ]
Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。
nDiki は1999年1月に始めたコンピュータ日誌を前身とする Naney の Web 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。
※内容は個人的見解であり所属組織とは関係ありません。