2009年03月07日

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
Posted by admin at 2009年03月07日 18:22