OpenID

Single Sign inのための仕組みとして、OpenIDというものがあります。OpenIDに対応しているプロバイダに登録してあるアカウントとパスワードで、他のサービスも受けちゃおうというヤツです。

現在、とある事情で、OpenPNE + mod_auth_openid + Apache2という組み合わせで、OpenPNEに登録されているアカウントで、アクセス制限をかける実験をしているのですが、これが全然上手く動かないのです。

確かに、OpenPNEにログインしているアカウントなのに「ログイン中のユーザではありません」とかいわれて拒否されるのはなんでか?と調べていくと、openid.identityというパラメータに渡っているべき、ユーザIDがまるっと削れている。何故?と調べていくと、ここが一文字だけだと削れてしまうことが判明。ためしに、7桁もあるユーザIDのミクシィを使って認証させると、サクサク通る。

ダレが、これを削っているのかと調べていくと、mod_auth_openidが利用している、libopkele の、URIを正規化している関数にバグがあって、認証用のURIの最後が ‘/x’ のように、「スラッシュ+一文字」だと、そこが削れてしまうのでした。早速修正して、バグレポートをlibopkeleの作者に送ると「今晩、新しい版をリリースするよ。」と、このためだけに新しい版をリリースしてくれました。(2.0.3)

これで、いけると、再トライすると、確かに、少し進むように。が、進んだところで「なんかエラー」と言われて認証できない状態。更に調べていくと、mod_auth_opeind(というかlibopkele)がチェック用に生成する署名と、OpenPNEが送ってきている署名が一致しないので認証できないという状態。署名が一致しないのは、OpenPNEをプロバイダにした場合だけ。さて、何が悪いのか……。