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はどうやら上手く処理出来ている模様です。
まとめ
XRI Resolution 2.0 はまったく読む気力が起きない。
じゃなくて、Proxy Resolver に指定するパラメータには細かな制御が出来たりするよと言うお話でした。
今度ちゃんと調べるので個人的なメモなのです。
んー、前に作った XRI::Resolution::Lite も色々直さないとなー。