連載の第1回では既存サービスを例にして、
今回からは、
第2回ではOpenIDに対応したライブラリを紹介し、
OpenIDの対応ライブラリ
OpenIDアカウントでログイン可能なサイト
幸い、 OpenIDの仕様に対応した各言語のライブラリがオープンソースとして公開されています。これらのライブラリを使うことで、
ここでは、
- OpenID Enabledのライブラリ
-
openidenabled.
com というサイトにて、JanRain, Inc.が実装したOpenIDライブラリが公開されています。 対応言語はPHP、
Python、 Rubyの3種類です。いずれもOpenIDのバージョン2に対応しています。JanRain, Inc.はmyOpenIDというOPも運営しています。 - code.
sixapart. comのライブラリ -
PerlでのOpenIDライブラリは、
Six Apart Codeリポジトリにて公開されているモジュールに、 limilic. com で公開されているパッチを当てたものが使われているようです。詳しくはYappoLogsのエントリが参考になります。
それでは、
RailsでOpenID対応のRPを動かしてみよう
こんどは、
ここでは、
- Ruby1.
8.6 - RubyGems1.
0.2 - Rails2.
0.2
OpenIDライブラリのインストール
Ruby用のOpenIDライブラリであるruby-openidのバージョンは2.
ruby-openidは以下のようにRubyGemsを使ってインストールします。
$ sudo gem install ruby-openid
正しくインストールされたかどうかは、
$ gem list
*** LOCAL GEMS ***
(中略)
rails (2.0.2)
rake (0.8.1)
ruby-openid (2.0.4)
RubyGemsでruby-openidをインストールすると、
${RUBYLIB}/gems/1.8/gems/ruby-openid-2.0.4
このディレクトリには、
Railsサンプルの起動
ruby-openidライブラリには、
$ cp -r example/rails-openid $HOME/openid
$ cd $HOME/openid/rails-openid
Railsを動かすために、
$ mkdir log db
なお、
$ vi config/environment.rb
config.action_controller.session = {
:session_key => '_openid_session',
:secret => 'c67504f48.....7e2557bc0'
}
準備ができたらRailsサーバを起動します。
ruby script/server
ブラウザでhttp://サーバのアドレス:3000/

OP への認証リクエストの送信
ここからはサンプルを動かしながら、
Railsを動かす環境が無い方は、
ログイン画面の表示(index.rhtml)
ログイン画面のソースコードはapp/
69 <form method="get" accept-charset="UTF-8"
70 action='<%= url_for :action => 'start' %>'>
71 Identifier:
72 <input type="text" class="openid" name="openid_identifier" />
73 <input type="submit" value="Verify" /><br />
Identifierと書かれた入力フィールドがOpenIDのアカウント名
OPへのリダイレクト(ConsumerController#start)
Identifierに自分のOpenIDを入力してVerifyボタンを押すと、
まず、
# ユーザが入力したopenid_identifierを元にOpenIDリクエストを作成
17 oidreq = consumer.begin(params[:openid_identifier])
oidreqのredirect_
# 利用者をOPのログイン画面(OP EndPoint)へと誘導する
47 redirect_to oidreq.redirect_url(realm, return_to, params[:immediate])
なお、
# 認証サーバ(OP)からの戻り先URL(completeアクションのURL)
43 return_to = url_for :action => 'complete', :only_path => false
# このサーバを識別するためのrealm
44 realm = url_for :action => 'index', :only_path => false
これで、
OPでのログイン
OPのログイン画面で、
OPからの認証結果の受け取り (ConsumerController#complete)
OPからの認証結果は、
55 current_url = url_for(:action => 'complete', :only_path => false)
56 parameters = params.reject{|k,v|request.path_parameters[k]}
# 戻り値を解析し、OpenID::Responseクラスのオブジェクトを作成
57 oidresp = consumer.complete(parameters, current_url)
completeメソッドの戻り値のoidrespは、
- OpenID::Consumer::FAILURE…メッセージの検証に失敗した
- OpenID::Consumer::SUCCESS…ログインに成功した
- OpenID::Consumer::SETUP_
NEEDED…セットアップが必要 - OpenID::Consumer::CANCEL…ユーザがログインを拒否した
ログインに成功していれば
# OpenIDレスポンスのステータスを確認
57 case oidresp.status
# ログイン成功なら、display_identifierからOpenIDのアカウント名を取得
65 when OpenID::Consumer::SUCCESS
66 flash[:success] = ("Verification of #{oidresp.display_identifier}"¥
67 " succeeded.")
最後に、

いかがでしたでしょうか。
少し概念が難しく感じるかもしれませんが、
次回は、