日向夏特殊応援部隊

俺様向けメモ

XRI Resolution のメモ

まず PHP/Ruby/Python を開発言語としている場合、OpenID Enabled のライブラリを使っておけばほぼ間違いないと言う事を前提に。

@freeXRI で遊ぶ

忘れてたけど @freeXRI で @id*zigorou って Community i-name 取ってたのを思い出したのでふと触ってみた。

さて、早速なので curl コマンドにて、

$ curl "http://xri.net/@id*zigorou?_xrd_r=application/xrds+xml"

とすると次のような XRDS が返って来る。

<?xml version="1.0" encoding="UTF-8"?>
<XRDS ref="xri://@id*zigorou" xmlns="xri://$xrds">
 <XRD version="2.0" xmlns="xri://$xrd*($v*2.0)">
  <Query>*id</Query>
  <Status ceid="off" cid="verified" code="100"/>
  <Expires>2008-08-14T16:51:57.000Z</Expires>
  <ProviderID>xri://@</ProviderID>
  <LocalID>!b1e8.c27b.e41c.25c3</LocalID>
  <CanonicalID>@!B1E8.C27B.E41C.25C3</CanonicalID>
  <Service priority="10">
   <ProviderID>xri://@id</ProviderID>
   <Type select="true">xri://$res*auth*($v*2.0)</Type>
   <Type select="true">xri://$res*auth*($v*2.0)</Type>
   <MediaType select="true">application/xrds+xml</MediaType>
   <URI append="qxri" priority="2">http://resolve.freexri.com/ns/@id/</URI>
   <URI append="qxri" priority="1">https://resolve.freexri.com/ns/@id/</URI>
  </Service>
  <Service priority="10">
   <Type match="default" select="false"/>
   <Path match="default" select="false"/>
   <MediaType match="default" select="false"/>
   <URI append="none" priority="10">http://www.freexri.com</URI>
  </Service>
 </XRD>
 <XRD xmlns="xri://$xrd*($v*2.0)">
  <Query>*zigorou</Query>
  <Status cid="verified" code="241">Requested service endpoint not found</Status>
  <ServerStatus code="100">Success</ServerStatus>
  <Expires>2008-08-14T17:49:42.646Z</Expires>
  <ProviderID>@!B1E8.C27B.E41C.25C3</ProviderID>
  <LocalID>!A79D.5E1A.ED82.AD1F</LocalID>
  <CanonicalID>@!B1E8.C27B.E41C.25C3!A79D.5E1A.ED82.AD1F</CanonicalID>
  <Service>
   <ProviderID>@!7F6F.F50.A4E4.1133</ProviderID>
   <Type select="true">http://openid.net/signon/1.0</Type>
   <Path select="true">(+login)</Path>
   <Path match="default"/>
   <MediaType match="default"/>
   <URI append="none" priority="2">http://authn.freexri.com/authentication/</URI>
   <URI append="none" priority="1">https://authn.freexri.com/authentication/</URI>
  </Service>
  <HostedBy>@freeXRI</HostedBy>
  <ServedBy>OpenXRI</ServedBy>
 </XRD>
</XRDS>

さて、普通に取れたぜって思う次第なんだけど良く見ると、

Requested service endpoint not found

とか言われてる件。なんじゃこりゃ><
幸い @freeXRI には XRI Resolution と言うツールがあるので試して見る事に。

みたいな感じ。良くみたら、"Resolve to" って項目があって、

  • Service Endpoint
  • Authority

ってのがある。Service Endpoint のままで*1実行すると curl の時と同じ結果が返って来るんだけど、こっちを Authority にすると期待通り OpenID に関する Service 要素を含んだ結果が返って来る。

XRI Resolution 2.0 を見る

どうやら 3.3 Media Types for XRI Resolution - XRI Resolution 2.0 にあるパラメータが関係してるらしい。sep=true でリクエストしてるとこうなるっぽぃ。

指定の仕方は 11.4 HXRI Encoding/Decoding Rules - XRI Resolution 2.0 辺りに書いてあって、Proxy Resolver に渡すクエリパラメータの一つである _xrd_r にメディアタイプを指定した後に、セミコロン(;)区切りで指定するようだ。

まぁここまでの話をまとめてさらに XRDS ではなく XRD のみで Authority を取得する場合、

$ curl "http://xri.net/@id*zigorou?_xrd_r=application/xrd+xml;sep=false"

のようにコマンドを打つと。

<?xml version="1.0" encoding="UTF-8"?>
<XRD xmlns="xri://$xrd*($v*2.0)">
 <Query>*zigorou</Query>
 <Status cid="verified" code="100">Success</Status>
 <ServerStatus code="100">Success</ServerStatus>
 <Expires>2008-08-14T18:06:48.939Z</Expires>
 <ProviderID>@!B1E8.C27B.E41C.25C3</ProviderID>
 <LocalID>!A79D.5E1A.ED82.AD1F</LocalID>
 <CanonicalID>@!B1E8.C27B.E41C.25C3!A79D.5E1A.ED82.AD1F</CanonicalID>
 <Service>
  <ProviderID>@!7F6F.F50.A4E4.1133</ProviderID>
  <Type select="true">http://openid.net/signon/1.0</Type>
  <Path select="true">(+login)</Path>
  <Path match="default"/>
  <MediaType match="default"/>
  <URI append="none" priority="2">http://authn.freexri.com/authentication/</URI>
  <URI append="none" priority="1">https://authn.freexri.com/authentication/</URI>
 </Service>
 <HostedBy>@freeXRI</HostedBy>
 <ServedBy>OpenXRI</ServedBy>
</XRD>

めでたく OpenID 用の Service 要素が取れました。この辺りはざっとソース見た感じでは OpenID Enabled のライブラリ*2はどうやら上手く処理出来ている模様です。

Proxy Resolver として使えるところ

などが使えます。他にも使えるところがあると思われる。

まとめ

XRI Resolution 2.0 はまったく読む気力が起きない。


じゃなくて、Proxy Resolver に指定するパラメータには細かな制御が出来たりするよと言うお話でした。
今度ちゃんと調べるので個人的なメモなのです。

んー、前に作った XRI::Resolution::Lite も色々直さないとなー。

*1: Result Type は XRDS or XRD にする

*2:正しくは php