Apache で OpenID 認証を行う 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_openid を svn からチェックアウト。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 を使える場合はいいんだけど、単なる静的コンテンツには使いづらい、という現状のようで。