よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

簡単にOPエンドポイントURLが発見できるかどうか確認する方法

独自OP(OpenID Provider)を構築したり、はてなやYahoo!などの外部サービスのOP(OpenID Provider)を利用するアプリケーションを作成するときに、ユーザが入力したOpenIDアカウント(User-Supplied Identifier)からOpenID認証プトロコルのメッセージを受け取るURLであるOPのURL(OP Endpoint URL)を見つける処理の動作確認などを行ったりするかと思います。
そんなときにirbruby-openid付属のスクリプトを利用して、簡単に確認する方法を今回は紹介したいと思います。

環境(Ubuntu 8.10)

ruby-openidがインストールされていない場合は以下のコマンドでインストール可能です。

[linux]$ sudo gem install ruby-openid

処理フロー

discoverしてOP Endpoint URLの情報等を取得するための処理フローは以下の図のようになっています。
#必要最低限のことしか記載していませんのであしからず。

f:id:interu:20090115100701p:image

其の壱 irbを利用して確認

irbを利用して、はてなのOpenIDアカウント(User-Supplied Identifier)でdiscoverしてみます。
#はてなのOpenIDアカウントは http://www.hatena.ne.jp/interu/ となります。

[linux]$ irb
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require 'openid'
=> true
irb(main):003:0> OpenID.discover("http://www.hatena.ne.jp/interu/")
=> ["http://www.hatena.ne.jp/interu/", [#@server_url="http://www.hatena.ne.jp/openid/server", @canonical_id=nil, @claimed_id="http://www.hatena.ne.jp/interu/">]]

上記の結果より、OP Endpoint URLが http://www.hatena.ne.jp/openid/server であることがわかります。
ついでにYahoo!についても調べてみます。

irb(main):004:0> OpenID.discover("yahoo.co.jp")
=> ["http://www.yahoo.co.jp/index.html", [#@server_url="https://open.login.yahooapis.jp/openid/op/auth", @canonical_id=nil, @claimed_id=nil>]]

こちらも取得できました。

参考までに、discoverに失敗した場合は以下のようなエラーとなります。

irb(main):005:0> OpenID.discover("http://www.hatena.ne.jp/interu")
OpenID::DiscoveryFailure: HTTP Response status from identity URL host is not "200".Got status "404" for http://www.hatena.ne.jp/interu
from /var/lib/gems/1.8/gems/ruby-openid-2.1.2/lib/openid/yadis/discovery.rb:84:in `discover'
from /var/lib/gems/1.8/gems/ruby-openid-2.1.2/lib/openid/consumer/discovery.rb:382:in `discover_yadis'
from /var/lib/gems/1.8/gems/ruby-openid-2.1.2/lib/openid/consumer/discovery.rb:478:in `discover_uri'
from /var/lib/gems/1.8/gems/ruby-openid-2.1.2/lib/openid/consumer/discovery.rb:487:in `discover'
from (irb):5
from :0

其の弐 discoverスクリプトを利用して確認

aptにてruby-openidをインストールした場合は、discoverスクリプトは以下の場所に保存されます。
以下はUbuntu 8.10の環境にてインストールした時のパスです。

/var/lib/gems/1.8/gems/ruby-openid-2.1.2/examples/discover

※discoverスクリプトについては、OpenIDプロトコルの特徴−DiscoveryとSREGにも詳細が書かれていますので、そちらも参考にしてください。

discoverスクリプトを実行するためには、Rubyライブラリの探索パスをruby-openidのlibに設定してからdiscoverスクリプトを実行します。

[linux]$ export RUBYLIB=/var/lib/gems/1.8/gems/ruby-openid-2.1.2/lib
[linux]$ ruby /var/lib/gems/1.8/gems/ruby-openid-2.1.2/examples/discover http://www.hatena.ne.jp/interu/

==================================================
Running discovery on http://www.hatena.ne.jp/interu/
Claimed identifier: http://www.hatena.ne.jp/interu/
Discovered services:
1.
Server URL : http://www.hatena.ne.jp/openid/server
Type URIs:
* http://openid.net/signon/1.1

discoverスクリプトを利用しても、OP Endpoint URLが http://www.hatena.ne.jp/openid/server であることは確認できました。

以上より、irbもしくはdiscoverスクリプトを利用して、ユーザーの認証に使う”OP Endpoint URL”を取得できているか簡単に確認することができました。