いますぐ使えるOpenID

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

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

前回のおさらい

前回は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

著者プロフィール

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

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

コメント

コメントの記入