Apache2::AuthenOpenID を使ってみたらはまったので直してみた

Apache2::AuthenOpenID を使って tracOpenID 認証を掛けようとしたら嵌ったので、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 全体でグローバルな設定になっていたため、最後に書いたので上書きされてしまって、 別に設定ができない。.htaccess に書くのなら問題ないんだけども。

$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 がリリースされました。