OpenIDで認証するサイトを作ってみよう

なんとか動くものが作れたような気がするけど、まとめを作る余力がない。無念だ。
以下、超適当メモ。


プロジェクトを作る

rails openid
cd openid/


OpenID用のプラグインをインストールしてgenerateする。

script/plugin install http://svn.s21g.com/public/rails/plugins/restful_open_id_authentication_redux/
script/generate open_id_authenticated User Sessions


generateしたらルートファイルを編集しろと言われたので編集する。(URLとコントローラーを関連付けるファイルらしい)

vi config/routes.rb 

以下を追加

  map.resources :users
  map.resource :sessions, :collection => { :begin => :post, :complete => :get }
  map.login  '/login',  :controller => 'sessions', :action => 'new'
  map.logout '/logout', :controller => 'sessions', :action => 'destroy'


セッションのコントローラーを編集する。

vi app/controllers/sessions_controller.rb
  • OpenID::SUCCESS」っていう定数を「OpenID::Consumer::SUCCESS」っていう名前に置き換える。
  • completeメソッドの中にある open_id_fields.any? の条件を外す
  • @user.login には open_id_response.identity_url をそのまんま入れてやる(よろしくないと思う)
  • @user.email には適当な文字列を入れてやる(よろしくないと思う)
  • 下の二行を app/controllers/application.rb に移動させる
  include AuthenticatedSystem
  before_filter :login_from_cookie


ユーザーのモデルを編集する。

vi app/models/user.rb
  • emailの必須チェックを外す。一意チェックも外す。


全ての画面で使われるビューを作る

vi app/views/layouts/application.html.erb

feedlistのソースから拝借

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title><%= h(@page_title)+" | " if @page_title %>OpenIDでログインしてみよう</title>
    <%= stylesheet_link_tag 'openid' %>
  </head>

  <body>
    <div id="container">
      <div id="header">
        <div id="navi">
          <%- if logged_in? -%>
            <%= link_to "ログアウト", logout_path, :method => :delete %>
          <%- else -%>
            <%= link_to "ログイン", login_path %>
          <%- end -%>
        </div>
        <div id="title">
          <a href="/">OpenIDでログインしてみよう</a>
        </div>
        <%- if flash.any? -%>
          <div id="flash"><%= flash[:notice] %></div>
          <% flash.clear %>
        <%- end -%>
      </div>
      <div id="main">
        <%= yield %>
      </div> 
    </div>
  </body>
</html>
rake db:migrate
script/server

ブラウザで「http://サーバー:3000/login」を開いて、OpenIDのURLを入力したら認証ができた。よかったよかった。

思ったこと

認証サーバーに「メールアドレスとニックネームを教えてくれ!」ってお願いして、その結果が open_id_fields っていうのに入って来るんだと思ってたけど何回やっても何回やっても入って来ない。ホントに認証できてるのかわからない。不安だ。
実際にプログラムを書いたり動かしたりアレコレやってみるのは楽しいのだけれど、記録を残さないと後で思い出せないので、まとめを作る余力は残しておかないとイカンなーと思った。