Apache2::AuthenOpenID を使って trac に OpenID 認証を掛けようとしたら嵌ったので、coderepos で branch 作っていじってみました。
http://coderepos.org/share/browser/lang/perl/Apache2-AuthenOpenID/branches/per_dir_config
まず trac の複数のプロジェクトに別々の認証を掛けたくて httpd.conf にこう書いた。
/trac/foo は OpenID を持っていれば誰でも入れて、/trac/bar は明示的に許可したユーザのみに使わせたい。
<Location /trac> SetHandler mod_python PythonHandler trac.web.modpython_frontend PythonOption TracEnvParentDir /home/trac </Location> <Location /trac/foo> AuthType OpenID AuthName "trac" trust_root http://example.com/trac/foo return_to http://example.com/trac/foo/openid consumer_secret "*********" require valid-user </Location> <Location /trac/bar> AuthType OpenID AuthName "trac" trust_root http://example.com/trac/bar return_to http://example.com/trac/bar/openid consumer_secret "*********" require user bar.openid.example.com require user baz.openid.example.com </Location>
ところが trust_root, return_to, cunsumer_secret は Apache 全体でグローバルな設定になっていたため、最後に書いたので上書きされてしまって、
$cf = Apache2::Module::get_config($self, $r->server, $r->per_dir_config);
このように $r->per_dir_config を使って、Location ごとに設定できるように修正。http://coderepos.org/share/changeset/15796
これで別々の認証を trac に掛けることができたが、wiki や ticket の更新ができない。
Missing or invalid form token. Do you have cookies enabled?
というエラーが出てしまう。
これ実は Cookie は関係なくて、必要ないところでも
my $q = CGI->new($r);
としていたので、ここで POST データが CGI.pm によって読み込まれてしまって trac に渡らないのが原因。必要ない場合は CGI->new() しないようにした。
ということで、どうでしょうか id:lopnor さん。
[追記]
上記修正が反映された 0.07 がリリースされました。