
先週のbuilder techtalkから俄然としてOpenIDが熱くなって来た今日この頃いかがお過ごしでしょうか。
先日参加して来たOpenID Hackathonの成果として、CodeReposがOpenIDのOpenID 2.0 Providerになりましたことをお知らせします。
CodeReposのアカウントをお持ちの方は、fastladderとかLIMLICとかのOpenIDでサインオンできるサービでOpenID URLをcoderepos.orgとだけ打ち込んでログインしてみて下さい。
2.0に対応していない所だったらhttp://coderepos.org/share/wiki/Committers/usernameとでも入れればいいと思います。
はてなもOpenIDでログイン出来るはずなのにOpenID URL入れる所が無くてドン引きした。
暫定でIdentityをhttp://coderepos.org/share/wiki/Committers/usernameという形にしてありますが、もっと良い案がありましたら教えてくださいまし。
OpenID Hackathonに参加するまでは今イチOpenIDの仕様が判ってなかったですがようやく判って来ました。
なんだかPerlでOpenID 2.0 Serverに対応してるモジュールが無かったっぽいんですが、code.sixapart.comのリポジトリにkazeburoさんのパッチをあてたら普通に2.0のOP作れてビックリしました。
このパッチもOpenID Hackathonの成果でしたっけ?
本来ならtracにOpenID OP pluginか何かを入れてやるんでしょうが、今回は勉強しながら作ったのでいびつな構成かもしれませんし、きっとZIGOROuさんがDISってくれるので、そのDIS記事見ながら改善します。
仕様を咀嚼してないのですが、CodeReposではこうやったよ!という例をメモります。
CodeReposのOpenID対応に関しての必要なコードやらテンプレートもCodeReposにコミットされてるので詳細はそっちで。
自分なりの用語の理解として
RPのOpenID URLにcoderepos.orgとかを入れた時にRPはどうやって認証URLを見つけるかというと、その入力されたドメインのHTTP HEADにあるX-XRDS-Locationというヘッダに入っているURLに書いてあるファイルを見てend pointを探します。
(余談だけどHackathonでDavidに、それDNSのTXTレコードとか使えば良いんじゃないか?と聞いてみたら「更新に時間がかかるでしょ」と。納得。)
Apacheの設定だと
Header add X-XRDS-Location http://openid.coderepos.org/server.xrdsを入れるだけ。
AddType application/xrds+xml .xrdsも必須。
<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS
xmlns:xrds="xri://$xrds"
xmlns:openid="http://openid.net/xmlns/1.0"
xmlns="xri://$xrd*($v*2.0)">
<XRD>
<Service priority="0">
<Type>http://specs.openid.net/auth/2.0/server</Type>
<URI>http://openid.coderepos.org/auth</URI>
</Service>
</XRD>
</xrds:XRDS>こんな感じす。
さっきのNet::OpenID::Serverにkazeburo patchを当ててhttp://svn.coderepos.org/share/websites/coderepos.org/openid/ここにあるようなコードを書いた。
RPはOPから渡されたIdentity URLに実際アクセスをして必要な認証情報の妥当性を見つけようとしてるらしいので、tracのテンプレートに
<?cs if:title ?><?cs if:string.find(title, 'Committers/') == 0 ?> <link rel="openid2.provider" href="http://openid.coderepos.org/auth" /> <link rel="openid.server" href="http://openid.coderepos.org/auth" /> <?cs /if ?><?cs /if ?>を追加してCommittersページの時だけlinkタグを出すようにした。
<Location /share/wiki/Committers>
Header unset X-XRDS-Location
Header add X-XRDS-Location http://openid.coderepos.org/signon.xrds
</Location>と書いて対応。<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS
xmlns:xrds="xri://$xrds"
xmlns:openid="http://openid.net/xmlns/1.0"
xmlns="xri://$xrd*($v*2.0)">
<XRD>
<Service priority="0">
<Type>http://specs.openid.net/auth/2.0/signon</Type>
<URI>http://openid.coderepos.org/auth</URI>
</Service>
</XRD>
</xrds:XRDS>こんなのになる。さっきPerlで書いたっていった認証 CGIの部分は実際は認証処理をしてません。
というかBasic認証でやっちゃいますので。その認証URLを見るにはBasic認証が必要なように設定します。
svnもtracもBasic認証使ってるからこそできる手抜きですね!
ただ一点気をつけないといけないのはPOSTの時は認証しないようにしとくこと。
何でかって言うとRPが認証URLにPOSTで何かしにくるから!何してるか良くわかんないけど何かPOSTしてる!
以上の手順でOpenID 2.0対応のOPを簡単に作ることができました。
CodeReposのアカウントを持っている人は全員プログラムのコードを書けることが保証されていて(ISPのSLA的な意味で)、アカウント持ってる人数も250人を越えているので、CodeReposがOpenIDプロバイダになることは結構面白い試みなんじゃないかと思います。(OpenID Hackathonに参加する口実で作り始めただけだけど)
どう書く?.orgとかCodeGolfとかがOpenIDのRPになって連携出来るようになると面白そうですね。
OAuthとかにも対応するともっと夢が膨らむでしょうか?
海外向けに英語の記事でも書いて自作自演digしたい所だけど、英語で長文書くのがしんどいからAjiajinで英語版の記事を誰かが書いてくれるのを気長に待つ。
という事で、CodeReposのコミッターの方々はどうぞご利用ください。
kazeburo patchは
OpenID2.0対応RPの作り方も熱烈キボンヌ
Posted by: at 2008年03月07日 10:25