ruby-openidを使ったRPの構築
1.ruby-openidのインストール
# gem install ruby-openid
2.Rails Project作成
$ rails sampleRP
3.Sessionsコントローラー作成
$ ruby script/generate controller sessions new create index destroy complete
4.必要なライブラリのrequire
******************* app/controller/sessions_controller.rb ************
require 'pathname'
require 'openid/store/filesystem'
require 'openid'
require 'openid/extensions/sreg'
require 'openid/extensions/ax'
require 'openid/extensions/pape'
**********************************************************************
5.セッション開始画面作成
********* app/view/sessions/new.erb ****************
<h1>Input OpenID</h1>
<% form_tag(:action => "create") do %>
<%= text_field_tag "openid_identifier" %>
<%= submit_tag "login" %>
<% end %>
***************************************************
6.OpenID::Consumerインスタンス作成のメソッドを作成
******************* app/controller/sessions_controller.rb ************
private
def rp
if @rp.nil?
dir = Pathname.new(RAILS_ROOT).join('db').join('cstore')
store = OpenID::Store::Filesystem.new(dir)
@rp = OpenID::Consumer.new(session, store)
end
return @rp
end
**********************************************************************
7.createアクションを作成
******************* app/controller/sessions_controller.rb ************
begin identifier = params[:openid_identifier]
if identifier.nil? flash[:error] = "OpenIDを入力してください"
redirect_to :action => 'new'
return
end
# RPインスタンスを生成し、identifierをもとディスカバリを行う
@oidreq = rp.begin(identifier)
rescue OpenID::OpenIDError => e
flash[:error] = "#{identifier}のDiscovery処理が失敗しました: #{e}"
redirect_to :action => 'new'
return
end
#復帰位置
return_to = url_for :action => 'complete', :only_path => false
#REALMを設定(RPのURL)
realm = url_for :action => 'index', :only_path => false
#OpenID Request をリダイレクトさせる
if @oidreq.send_redirect?(realm, return_to, params[:immediate])
# リダイレクト機能を使う場合
redirect_to @oidreq.redirect_url(realm, return_to, params[:immediate])
else
# JavaScriptを使ってPOSTで強制的にリダイレクトを実現する場合
render :text => @oidreq.html_markup(realm, return_to, params[:immediate], {'id' => 'openid_form'})
end
end
******************************************************************
8.completeアクションの作成
******************* app/controller/sessions_controller.rb ************
def complete
current_url = url_for(:action => 'complete', :only_path => false)
parameters = params.reject{|k,v|request.path_parameters[k]}
@oidresp = rp.complete(parameters, current_url)
end
******************************************************************
9.completeビューの作成
****************** app/views/sessions/complete.html.erb *********
<% require 'pp' %>
<h1>complete</h1>
<h2>oidresp</h2>
<pre>
<%= h(@oidresp.pretty_inspect) %>
</pre>---------------------------------------------------<br/>
******************************************************************
10.サーバ起動
$ ruby script/server
11.ログイン画面にアクセス
$ http://localhost:3000/sessions/new