Hatena::Groupkdri

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

2007-05-01

open_id_authenticationをつかってみる

|  open_id_authenticationをつかってみる - KazusaAPI開発日誌 を含むブックマーク はてなブックマーク -  open_id_authenticationをつかってみる - KazusaAPI開発日誌  open_id_authenticationをつかってみる - KazusaAPI開発日誌 のブックマークコメント

ユーザ認証にopen_id_authenticationをつかってみる。open_id_authenticationはrubyonrails.orgで開発されているので、すでにプラグインのsourceにはいっている。

インストール
% script/plugin install open_id_authentication 
+ ./open_id_authentication/CHANGELOG
+ ./open_id_authentication/README
+ ./open_id_authentication/Rakefile
+ ./open_id_authentication/init.rb
+ ./open_id_authentication/lib/generators/open_id_authentication_tables/open_id_authentication_tables_generator.rb
+ ./open_id_authentication/lib/generators/open_id_authentication_tables/templates/migration.rb
+ ./open_id_authentication/lib/open_id_authentication/association.rb
+ ./open_id_authentication/lib/open_id_authentication/db_store.rb
+ ./open_id_authentication/lib/open_id_authentication/nonce.rb
+ ./open_id_authentication/lib/open_id_authentication/setting.rb
+ ./open_id_authentication/lib/open_id_authentication.rb
+ ./open_id_authentication/tasks/open_id_authentication_tasks.rake
+ ./open_id_authentication/test/normalize_test.rb
+ ./open_id_authentication/test/open_id_authentication_test.rb
+ ./open_id_authentication/test/status_test.rb
ruby-openidのインストール

open_id_authenticationはruby-openidに依存しているので、ruby-openidをインストールする。

sudo gem install ruby-openid
テーブルスキーマのインストール

open_id_authentication/READMEにしたがい、

% rake open_id_authentication:db:create 
(in /Users/nakao/Applications/aaa)
      exists  db/migrate
      create  db/migrate/002_add_open_id_authentication_tables.rb
% rake db:migrate(in /Users/nakao/Applications/aaa)
== AddOpenIdAuthenticationTables: migrating ===================================
-- create_table("open_id_authentication_associations", {:force=>true})
   -> 0.3324s
-- create_table("open_id_authentication_nonces", {:force=>true})
   -> 0.2715s
-- create_table("open_id_authentication_settings", {:force=>true})
   -> 0.2844s
== AddOpenIdAuthenticationTables: migrated (0.8889s) ==========================

を実行して、テーブルを作成。

もしくは、ファイルベースの認証キーの管理をすることも出来る。その場合は、config/environment.rbに、

OpenIdAuthentication.store = :file

を追加すると、RAILS_ROOT/tmp/openidsが参照される、らしい。

config/route.rb
  map.open_id_complete 'session', :controller => "session", :action => "create", :requirements => { :method => :get }  
  map.resource :session

app/views/sessions/new.erb
  <% form_tag(session_url) do %>
    <p>
      <label for="name">Username:</label>
      <%= text_field_tag "name" %>
    </p>

    <p>
      <label for="password">Password:</label>
      <%= password_field_tag %>
    </p>

    <p>
      ...or use:
    </p>

    <p>
      <label for="openid_url">OpenID:</label>
      <%= text_field_tag "openid_url" %>
    </p>

    <p>
      <%= submit_tag 'Sign in', :disable_with => "Signing in&hellip;" %>
    </p>
  <% end %>
app/controllers/session_controller.rb
  class SessionController < ApplicationController
    def create
      if using_open_id?
        open_id_authentication
      else
        password_authentication(params[:name], params[:password])
      end
    end


    protected
      def password_authentication(name, password)
        if @current_user = @account.users.authenticate(params[:name], params[:password])
          successful_login
        else
          failed_login "Sorry, that username/password doesn't work"
        end
      end

      def open_id_authentication
        authenticate_with_open_id do |result, identity_url|
          case result
          when :missing
            failed_login "Sorry, the OpenID server couldn't be found"
          when :canceled
            failed_login "OpenID verification was canceled"
          when :failed
            failed_login "Sorry, the OpenID verification failed"
          when :successful
            if @current_user = @account.users.find_by_identity_url(identity_url)
              successful_login
            else
              failed_login "Sorry, no user by that identity URL exists (#{identity_url})"
            end
          end
        end
      end
    
    
    private
      def successful_login
        session[:user_id] = @current_user.id
        redirect_to(root_url)
      end

      def failed_login(message)
        flash[:error] = message
        redirect_to(new_session_url)
      end
  end

使い方が分からないので、ソースを読むことにする。

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