いますぐ使えるOpenID

第3回 OpenIDプロトコルの特徴-DiscoveryとSREG

この記事を読むのに必要な時間:およそ 5 分

HTMLからOPのURLを取得する

はてなもYahoo!もdiscoveryによってOPのエンドポイントURLを見つけることができました。 ですが,はてなとYahoo!では,具体的な見つける手法は異なります。 もう少し詳しく見てみましょう。

はてなの場合は,利用者が入力したURLに存在するHTMLの中に,OpenIDのサーバ名がそのまま書かれています。

curlコマンドを使ってHTMLを取得し,openidという文字が含まれる行だけを抜き出してみます。

$ curl http://www.hatena.ne.jp/kmachu/ | grep openid
<link rel="openid.server" href="http://www.hatena.ne.jp/openid/server" /> 

HTML文書に含まれるlink要素として,openid.serveのURLがhttp://www.hatena.ne.jp/openid/serverであることが記述されています。 この記述方法は,OpenIDのバージョン1のフォーマットです。 そのため,discoveコマンドは,はてなの OPがOpenID 1.1対応と判定したのです。

なお,OpenIDのバージョン1.1では,HTMLに記述する方法がdiscoveryの唯一の方法です。

Yadis+XRDSからOPのURLを取得する

次にYahoo!で試してみましょう。 同じようにcurlコマンドを使ってHTMLを取得し,openidという文字が含まれる行を探してみます。

$ curl http://www.yahoo.com/ | grep openid

結果は空でした。HTMLの中にはOpenIDの記述が書かれていないようです。 実はYahoo!では,OPのエンドポイントURLはHTML文書とは別の場所に置かれたXRDSというXML文書に書かれています。 XRDS文書の場所は,HTTPレスポンスヘッダに含まれる「X-XRDS-Location」というパラメータで指定されます。

$ curl --head http://www.yahoo.com/
HTTP/1.1 200 OK
Date: Thu, 27 Mar 2008 23:18:13 GMT
X-XRDS-Location: http://open.login.yahooapis.com/openid20/www.yahoo.com/xrds 
Last-Modified: Thu, 27 Mar 2008 23:04:22 GMT
Content-Length: 9616
Connection: close
Content-Type: text/html; charset=utf-8

指定されたURLにアクセスするとXRDS文書が取得できます。 このXMLの中に,OPのエンドポイントURLが記述されています。

$ curl http://open.login.yahooapis.com/openid20/www.yahoo.com/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>
      <Type>http://specs.openid.net/extensions/pape/1.0</Type>
      <URI>https://open.login.yahooapis.com/openid/op/auth</URI>
    </Service>
  </XRD>
</xrds:XRDS>

このように,Yahoo!ではOPのエンドポイントURLを取得するために2つのステップを踏みます。

  1. 利用者が入力したURLからXRDS文書のURLを取得する
  2. XRDS文書を取得し,XRDS文書中に書かれているOPのエンドポイントURLを取得する

ステップが一つ増えているので,ちょっと複雑に感じるかもしれませんが,HTML中にURLを書くのではなく別のXML とすることで,より柔軟な記述が可能となっています。 なお,URLからXRDS文書を見つける手順はOpenIDとは別のYadisという仕様で決められています。

discoveryのまとめ

動的にOPのエンドポイントURLを見つけるdiscoveryには,以下の方法がありました。

  • HTML文書に書かれたOPのエンドポイントURL取得する
  • Yadisプロトコルを使ってXRDS文書を探し,XRDS文書に書かれたOPのエンドポイントURLを取得する

図1

YadisとXRDS文書については,以下のサイトの資料が参考になります。

参考サイト
URLhttp://d.hatena.ne.jp/ZIGOROu/20080317/1205725544

著者プロフィール

松岡浩平(まつおかこうへい)

NTTコムウェア株式会社にて,オープンソースを活用した認証システムの開発を担当しています。ここ2年は,情報セキュリティ大学院大学に通学しながら,OpenIDを使った認証システムについて研究していました。