2008年03月03日

先週の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記事見ながら改善します。

超簡単なOpenID 2.0対応のOP作り方

仕様を咀嚼してないのですが、CodeReposではこうやったよ!という例をメモります。
CodeReposのOpenID対応に関しての必要なコードやらテンプレートもCodeReposにコミットされてるので詳細はそっちで。

自分なりの用語の理解として

  • OP=認証サーバ
  • RP=OPの認証を貰う外部サイト
  • xrds=認証に必要な情報を入れた容器
  • Identity=ユニークなIDになれるURL
こんな感じ

server xrdsをRPに見つけてもらう。

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
を入れるだけ。
mime typeも合わせとかなきゃいけないので
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/ここにあるようなコードを書いた。

IdentityのHTML中にメタ情報を入れる

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タグを出すようにした。
これ書くことでOpenID 1.1のOPにもなれてるんだと思う。
そして、大事な物としてIdentity URLのRespons HEADで吐くX-XRDS-Locationの中身をさっきのとは違うのにしとかなきゃいけなくて
<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は# 2008年03月03日 miyagawa miyagawa openid will commit on Monday. Thanks!!CommentsAdd Starらしいのでpatchもうちょっとしたらコミットされるね。

Posted by Yappo at 2008年03月03日 16:06 | TrackBack | tech
Comments

OpenID2.0対応RPの作り方も熱烈キボンヌ

Posted by: at 2008年03月07日 10:25
Post a comment









Remember personal info?






コメントを投稿する前に↓の場所にnospamと入力してください。