OpenIDその後。

こないだ書いたRailsアプリケーションでOpenIDを使う記事だけど、ruby-openid2.xが出てそのままじゃ通用しなくなりました。RubyGems1.0以降ではruby-openidの1.x系は使えない*1から、移行必須。
結構変わっているようなので、アプリケーション側に手を入れる必要があります。


まずgem類の更新。この際RubyGems本体も更新しておきましょうか。

$ sudo gem update --system
$ sudo gem update ruby-openid


続いてvendor/plugins以下のactive_record_openid_storeプラグインを更新します。場所は前と同じ/opt/local/lib/ruby/gems/1.8/gems/ruby-openid-x.x.x/examples/active_record_openid_store。OpenID StoreにARを使わないならこの作業は不要。
プラグイン更新後、データベースのマイグレーションも要ります。プラグイン同梱のXXX_upgrade_open_id_store.rbをdb/migrate/にコピーしてリネーム、rake db:migrate。


それではopenid_controller.rbを書き換えましょう。
consumerメソッド

-    store = ActiveRecordOpenIDStore.new
+    store = ActiveRecordStore.new

なんか名前衝突しそうで怖いんですがこうなってます。
次、loginメソッド。

def login
  openid_url = params[:openid_url]
  
  if request.post?
    begin
      request = consumer.begin(openid_url)
      return_to = url_for(:action=> 'complete')
      trust_root = url_for(:controller=>'')

      url = request.redirect_url(trust_root, return_to)
      redirect_to(url)
      
    rescue OpenID::OpenIDError
      flash[:notice] = "認証に失敗しました"
    
    end
  end
end

メッセージ類は適宜書き換えてください。
最後はcompleteメソッド。

-    response = consumer.complete(params)
+    current_url = url_for(:action => 'complete', :only_path => false)
+    parameters = params.reject{|k,v|request.path_parameters[k]}
+    response = consumer.complete(parameters, current_url)

completeメソッドの頭の方は上のように書き換えて、後ろの方に多分OpenID::SUCCESSとかOpenID::FAILURE使ってると思うんですがこれらの定数はそれぞれOpenID::Consumer::SUCCESS、OpenID::Consumer::FAILUREとなっているので書き換えます。


これで以前に作ったOpenID対応アプリケーションがruby-openid2.xで動くはずです。

*1:require_gemのサポートが切れるため