Hatena::Groupkdri

KazusaAPI開発日誌 このページをアンテナに追加 RSSフィード

2007-05-02

Restful Open ID Authentication を試してみる

|  Restful Open ID Authentication を試してみる - KazusaAPI開発日誌 を含むブックマーク はてなブックマーク -  Restful Open ID Authentication を試してみる - KazusaAPI開発日誌  Restful Open ID Authentication を試してみる - KazusaAPI開発日誌 のブックマークコメント

open_id_authenticationプラグインの利用は挫折ぎみなので、open_id_authentication (part 2) | Leancodeで紹介されていたno titleをつかってパスワード認証とOpenID認証の両方が利用できるRailsアプリの構築を試してみる。

screenshot screenshot

まず、お試し用のrailsアプリを準備
rails -d sqlite3 roia
restful_open_id_authenticationプラグインをインストール
script/plugin install http://svn.eastmedia.com/svn/bantay/plugins/trunk/restful_open_id_authentication
userモデルとsessionコントローラを生成
script/generate open_id_authenticated user session
usersテーブルを作成
rake db:migrate
RESTfulなルーティングを設定

config/route.rbの頭の方に追加。ログアウト用のdestroyメソッドも追加しておく。

  map.resources :users
  map.resource  :session, :collection => { :begin => :post,
                                           :complete => :get, 
                                           :destroy => :get }
ユニットテスト実行
rake test

で、4 Errorsだったので、ソースを精査することに。

その結果、app/views/users/new.rhtmlの

    8 <% form_for @user do |f| -%>

    8 <% form_for :user, @user, :url => { :action => 'create' } do |f| -%>

に変更。で、0 Errorsに。

サーバの起動
script/server
OpenIDを使ったログイン
  1. http://localhost:3000/session/new を開く。
  2. http://nakao.mitsuteru.myopenid.com/をIdentitiy URLに入力して Verify をクリック。
  3. myOpenid.com へリダイレクトされて
  4. "Select a persona:"でnicknameを指定して、"Allow Forever"もしくは"Allow once"、"Deny"を選択。ここでは、"Allow once"をクリック。
  5. http://localhost:3000/へリダイレクトされて、認証は出来た模様。

認証されると、current_user.login が nickname になり、current_user.open_id_url が http://nakao.mitsuteru.myopenid.com/ となる。

ここでハマった点として、myOpenid.com では2文字のnicknameが作成できるが、restful_open_id_authenticationプラグインでは3文字から40文字までと決まっていた点である。

これは、app/models/user.rbの

     11   validates_length_of       :login,    :within => 3..40

で定義されている。

つぎに、パスワードによるログイン
  1. http://localhost:3000/users/new でユーザ作成。
  2. http://localhost:3000/session/new でログイン。

これは、http://kdri.g.hatena.ne.jp/nakao_mitsuteru/20070430/acts_as_authenticatedと同様である。

ログアウト

RESTfulに GET http://localhost:3000/session;destroy でログアウトできる。次のようなErbコードでそのためのリンクを生成できる。

<%= link_to 'Logout', destory_session_path, :confirm => "Are you sure?" %>

まとめ

restful_open_id_authenticationプラグインによるOpenID認証とパスワード認証をひとつのRailsアプリに組み込むことをためした。restful_open_id_authenticationプラグインのgeneratorのコードに若干手を加えないと動作しないが、期待通りに動かすことができた。

実際の動作確認にはセッション(@session)とユーザ(current_user)をモニターするコントローラを作成した。

トラックバック - http://kdri.g.hatena.ne.jp/nakao_mitsuteru/20070502