前回のおさらい
前回はRPのサンプルをRails上で動作させました。 この時に使用したRailsのアクションをまとめておきます。
- ConsumerController#begin
- OpenIDリクエストを生成するRailsのアクション。
- ConsumerController#complete
- OpenIDレスポンスを受信するRailsのアクション。
OpenIDの一番の特徴は,分散型である(複数のOPが存在する)ことです。 そのためDiscoveryなどの,OpenID特有の処理があります。 ですので今回は,OpenIDプロトコルの特徴的な箇所を,もう少し深く見ていきましょう。 取り上げるのはDiscoveryとSREGの2つです。
- Discovery
- 利用者が入力したOpenIDアカウント名(User-Supplied Identifier)を元にOPのログイン画面(OP Endpoint URL)を見つける。
- SREG
- OpenIDの拡張領域を使って利用者のメールアドレスなどをOPとRPで交換する。
Discovery…OpenIDアカウント名からOPのログイン画面を見つける
前回のサンプルでは,はじめに利用者がRPのログイン画面にOpenIDのアカウント名を入力しました。 このときOpenIDライブラリを使って,アカウント名からOpenIDリクエストを作成しています。
# ユーザが入力したopenid_identifierを元にOpenIDリクエストを作成
17 oidreq = consumer.begin(params[:openid_identifier])
consumerはOpenID::Consumerクラスのオブジェクトで,oidreqはOpenID::Requestクラスのオブジェクトでした。 OpenID::Consumerオブジェクトのbeginメソッドを呼び出してOpenID::Requestオブジェクトを取得します。 OpenID::Requestオブジェクトのredirect_urlメソッドで,OPのログイン画面のURLを取得できます。
# 利用者をOPのログイン画面(OP EndPoint)へと誘導する
47 redirect_to oidreq.redirect_url(realm, return_to, params[:immediate])
ここで重要なのは,利用者が入力するOpenIDアカウント名のURLと,利用者をOPのログイン画面へと誘導するためのURLは異なることです。 OpenIDの仕様では,利用者を誘導先となるOPのURLのことを,OPのエンドポイントURL(OP Endpoint URL)と呼びます。
- はてな
- 利用者が入力したOpenIDアカウント名(User-Supplied Identifier)
- http://www.hatena.ne.jp/kmachu/
- OPのエンドポイントURL(OP Endpoint URL)
- http://www.hatena.ne.jp/openid/server
- Yahoo!
- 利用者が入力したOpenIDアカウント名(User-Supplied Identifier)
- yahoo.com
- OPのエンドポイントURL(OP Endpoint URL)
- https://open.login.yahooapis.com/openid/op/auth
OpenIDでは不特定多数のOPが存在するため,事前に「はてなの場合はこのURL, Yahoo!の場合はこのURL」などとOP のエンドポイントURLを覚えておくことはできません。 OPのエンドポイントURLを動的に見つける必要があります。 前回のサンプルでは,OpenID::Consumerのbeginメソッドを呼び出したときにOPのURLを見つける処理をOpenIDライブラリが実行しています。 これが「discovery」です。 discoveryにはいくつかの方法があり,どの方法が使えるかはOP次第です。
- HTMLの中にOPのエンドポイントURLを記述する
- YadisとXRDSを用いる
概念を説明するよりも,具体的な例を見た方が分かりやすいと思います。
discoveryコマンドを使って認証サーバを見つけよう
ruby-openidライブラリには,OpenIDのdiscoveryを試すことができるdiscoverスクリプトが付属しています。 discoverは以下の場所にあります。
ruby-openid-2.0.4/examples/discover
まず,はてなのOpenIDアカウント名を入力してみましょう。
$ ./discover http://www.hatena.ne.jp/kmachu/
==================================================
Running discovery on http://www.hatena.ne.jp/kmachu/
Claimed identifier: http://www.hatena.ne.jp/kmachu/
Discovered services:
1.
Server URL : http://www.hatena.ne.jp/openid/server
Type URIs:
* http://openid.net/signon/1.1
Claimed identifierが入力したOpenIDアカウント名です。 discoverコマンドはこのURLを元にdiscoveryを行い,OPのエンドポイントURLであるhttp://www.hatena.ne.jp/openid/serverを見つけています。 同時に,このOPが対応しているOpenIDのバージョンが1.1であることも認識しています。
Yahoo!でも試してみましょう。 Yahoo!の場合は利用者のOpenIDアカウント名ではなくyahoo.comとだけ入力すればよかったですね。 このyahoo.comのことをOP Identifierと言います。
$ ./discover yahoo.com
Running discovery on yahoo.com
Claimed identifier: http://www.yahoo.com/
Discovered services:
1.
Server URL : https://open.login.yahooapis.com/openid/op/auth
Type URIs:
* http://specs.openid.net/auth/2.0/server
* http://specs.openid.net/extensions/pape/1.0
はてなの例と同じように,OPのエンドポイントURLであるhttps://open.login.yahooapis.com/openid/op/authを取得できました。 さらに,OpenID 2.0に対応していることと,PAPEという拡張領域に対応していることも分かります。 拡張領域については後ほど説明します。
なお,2007年4月時点で,はてなではOpenID2.0に対応していないため,OP Identifierを入力 してもdiscoveryに失敗します。
$ ./discover http://www.hatena.ne.jp/ ================================================== Running discovery on http://www.hatena.ne.jp/ Claimed identifier: http://www.hatena.ne.jp/ No OpenID services found

