XRDSって何?

ぶっちゃけ、よく知りません。
OpenID Provider の情報を記述したXML形式のファイルだと思います。


XRDSってどう使うの?

@ITに記事があるよ
・・・まぁ、説明はこれで済んでしまうんですが。。。

一応、導入ログ書きます。


XRDSファイルを作る

とりあえず、Yahoo!、はてな、openid.ne.jp の OpenID Provider を記述した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/signon</Type>
      <URI>https://open.login.yahooapis.jp/openid/op/auth</URI>
      <LocalID>##Yahoo!から発行されたOpenID##</LocalID>
    </Service>
    <Service priority="1">
      <Type>http://openid.net/signon/1.0</Type>
      <Type>http://openid.net/signon/1.1</Type>
      <Type>http://openid.net/sreg/1.0</Type>
      <URI>https://www.hatena.ne.jp/openid/server</URI>
      <openid:Delegate>##はてなから発行されたOpenID##</openid:Delegate>
    </Service>
    <Service priority="2">
      <Type>http://openid.net/signon/1.0</Type>
      <Type>http://openid.net/signon/1.1</Type>
      <Type>http://openid.net/sreg/1.0</Type>
      <URI>http://www.openid.ne.jp/user/auth</URI>
      <openid:Delegate>##openid.ne.jpから発行されたOpenID##</openid:Delegate>
    </Service>
  </XRD>
</xrds:XRDS>
こんな感じ。
##~##の部分は自分で取得したOpenIDに置き換えてください。
あと、はてなのXRDSが見つからなかったので、はてなの設定はopenid.ne.jpのをコピった。
一応、priority 順に認証チャレンジするみたい。
でもたまに、ランダムじゃねーか?と思うことはよくある。


XRDSファイルの設置

設置方法は複数考えられます。
XRDSは出力の際 Content-Type: application/xrds+xml をHTTPレスポンスヘッダに付与する必要があるので、
  1. HTTPヘッダーを書きかえれるスクリプト言語を利用して出力
  2. MIMEタイプに application/xrds+xml を登録
とりあえず、このどちらかの対応が必要になると思います。


スクリプト言語を利用して出力するパターン

これはサーバサイドのスクリプト言語であれば、ほとんどの場合いけるはず。
ここでは PHP でのサンプルです。
<?php
header('Content-Type: application/xrds+xml');
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
?>
<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>https://open.login.yahooapis.jp/openid/op/auth</URI>
      <LocalID>##Yahoo!から発行されたOpenID##</LocalID>
    </Service>
    <Service priority="1">
      <Type>http://openid.net/signon/1.0</Type>
      <Type>http://openid.net/signon/1.1</Type>
      <Type>http://openid.net/sreg/1.0</Type>
      <URI>https://www.hatena.ne.jp/openid/server</URI>
      <openid:Delegate>##はてなから発行されたOpenID##</openid:Delegate>
    </Service>
    <Service priority="2">
      <Type>http://openid.net/signon/1.0</Type>
      <Type>http://openid.net/signon/1.1</Type>
      <Type>http://openid.net/sreg/1.0</Type>
      <URI>http://www.openid.ne.jp/user/auth</URI>
      <openid:Delegate>##openid.ne.jpから発行されたOpenID##</openid:Delegate>
    </Service>
  </XRD>
</xrds:XRDS>
これを xrds.php とかの名前で保存して、Webの公開領域に設置します。


MIMEタイプを登録するパターン

AddType application/xrds+xml xrds
上記の記述を Apache の設定ファイルに書くか、XRDSを設置するディレクトリまたは、さらに上位の公開ディレクトリに .htaccess を作ってそこに記述する。
この操作は、環境、権限によっては許可されないので、自分の環境を良く確認しましょう。

XRDSファイルは index.xrds などの名前にして公開領域に設置します。
ちなみに、XRDSファイルの拡張子が xrds で正しいかどうかは解りません。><


公開確認

スクリプト版、MIME登録版ともにURLを叩いてアクセスできることを確認します。
環境によると思いますが、ブラウザでアクセスするとXRDSファイルをダウンロードしようとするはずです。


XRDSファイルのURLを通知する

自分のドメイン(例:hoge.com)を使って認証する場合、OpenIDクライアントはドメイン直下のインデックスファイル(例:http://hoge.com/index.html)を見に行きます。
なので、この段階でXRDSファイルのURLをOpenIDクライアントに対して明示すれば、OpenIDクライアントはXRDSファイルを見つけ出し、その中に指定してある OpenID Provider に認証を要求することが可能となります。

XRDSファイルの通知方法としては、
  1. インデックスファイルのHTTPレスポンスヘッダに "x-xrds-location: ##XRDSファイルのURL##" を設定する。
  2. インデックスファイルのページヘッダに meta 要素で指定する。
  3. そもそも、インデックスファイル自体がXRDSファイルだ。
がある。
1番目のやり方は、"スクリプト言語を利用して出力するパターン"でのやり方と同じく、スクリプトでヘッダを出力する。
3番目のは、そもそも中継をしない。まぁ、こんな状況はまず無いと思うけど、mod_rewrite でリクエスト環境ごとに応答ファイルを切り替えるというのがスマートかもしれない。

だが、おそらく最もシンプルな方法は2番目の meta 要素で指定する方法だと思う。
単純にインデックスファイルのHTMLヘッダに下記を追加すればいい。
<meta http-equiv="X-XRDS-Location" content="##XRDSファイルのURL##" />
これだけ。

たとえば、XRDSファイルのURLが http://hoge.com/index.xrds の場合、
<html>
<head>
<title>hoge.com</title>
<meta http-equiv="X-XRDS-Location" content="http://hoge.com/index.xrds" />
</head>
<body>
fuga
</body>
</html>
こんな感じで書けばいい。


まとめ

OpenIDはとっても便利なので、早く広まってほしいなぁ。
Webサービスごとに、会員登録したり、そのIDとPASSを覚えなきゃいけないなんて、面倒だよね。


--
Yahoo!カテゴリに登録されてるOpenID対応サイトのOpenIDクライアントは、半分ぐらいまともに動かない。
・・・どういうこと?