読者です 読者をやめる 読者になる 読者になる

mod_auth_openid を使ってみる

ApacheOpenID 認証を行う mod_auth_openid を試してみた。
インストールする OS は CentOS-4 (多分 5の方が楽)。
まず C++ で書かれた OpenID ライブラリ libopkele をインストール……するのだけど、その前に pkg-config で libpcre を扱えるように、libpcre.pc を用意 (これは CentOS-5 だと libpcre のパッケージに入ってる)。
/usr/lib/pkgconfig/libpcre.pc

# Package Information for pkg-config

prefix=/usr
exec_prefix=/usr
libdir=/usr/lib
includedir=/usr/include/pcre

Name: libpcre
Description: PCRE - Perl compatible regular expressions C library
Version: 4.5
Libs: -L${libdir} -lpcre
Cflags: -I${includedir}

libopkele は野良ビルド

$ wget http://kin.klever.net/dist/libopkele-0.3.2.tar.gz
$ tar zxvf libopkele-0.3.2.tar.gz
$ cd libopkele-0.3.2
$ ./configure
$ make
# make install

続いて mod_auth_openidsvn からチェックアウト。trunk には configure が含まれていなかったので、少し前の tags/mod_auth_openid-0.2 を使ってみた。

$ svn co https://svn.butterfat.net/public/mod_auth_openid/tags/mod_auth_openid-0.2 mod_auth_openid
$ cd mod_auth_openid
$ ./configure
$ make
# make install

httpd.conf には以下の行が追加されている。

LoadModule authopenid_module  modules/mod_auth_openid.so

とりあえず

<Location /openid>
  AuthOpenIDEnabled  On
</Location>

のみ設定して httpd restart.

/openid にアクセスすると、以下のような認証画面が出る。この画面は AuthOpenIDLoginPage ディレクティブで変更可能(だそうだが未確認)。

ここで OpenID URL を入力して認証を通れば、環境変数 REMOTE_USER に Identity (はてなの場合だと http://www.hatena.ne.jp/**** ) が設定された状態でページが表示される、という具合。
認証を通った後は Cookie ベースでのセッション管理が行われて、セッション情報は Berkeley DB に保存される実装になっている。

ということで、とりあえず認証 (Authentication) はできたのだけど、認証を通ったユーザに対してユーザ別のアクセス制限ができない。このユーザとこのユーザだけは許可……みたいなのが。
AuthOpenIDTrusted と AuthOpenIDDistrusted で OpenID のサーバ単位で許可不許可は設定できるのだけど、Identity (ユーザ名に相当するURL) に対してどうこう、というのが出来ないみたい。
というのは、mod_auth_openid は ap_hook_handler で動作していて、他の Apache の認証機構が働いた「後」に実行されるかららしい。

require user http://example.com/foo 

とか、mod_rewrite を使って

RerwriteCond %{REMOTE_USER} http://example.com/foo

とかも試してみたのだが、だめ。rewrite の時点でも REMOTE_USER は未設定。

認証後、スクリプトを動かして REMOTE_USER を使える場合はいいんだけど、単なる静的コンテンツには使いづらい、という現状のようで。