railsでopenid試してみる。 openid_login_generatorでやってみた。

gem入れる

$ gem install ruby-openid
$ gem install openid_login_generator
$ gem install ruby-yadis

$ gem list --local

(ç•¥)
openid_login_generator (0.1)
rails (2.0.2)
rake (0.8.1)
ruby-openid (2.0.3)
ruby-yadis (0.3.4)

新しいRailsプロジェクト作る

$ rails openidtest -d mysql
(ç•¥)
$ cd openidtest
$ rake db:create

で、プロジェクトできてdevelopmentのDBも作られる

generate

$ ./script/generate openid_login account
      create  lib/openid_login_system.rb
      create  app/controllers/account_controller.rb
      create  test/functional/account_controller_test.rb
      create  app/helpers/account_helper.rb
      create  app/models/user.rb
      create  test/unit/user_test.rb
      create  test/fixtures/users.yml
      create  app/views/layouts/scaffold.rhtml
No such file or directory - /opt/rubygems/gems/rails-2.0.2/lib/rails_generator/generators/components/scaffold/templates/layout.rhtml

怒られる。
とりあえず消す

$ ./script/destroy openid_login account

generatorいぢる

さっきlayout.rhtmlがねーぞと怒られたので、/opt/rubygems/gems/rails-2.0.2/lib/rails_generator/generators/components/scaffold/templates/をみたら

$ ls /opt/rubygems/gems/rails-2.0.2/lib/rails_generator/generators/components/scaffold/templates/
controller.rb       helper.rb        style.css           view_index.html.erb  view_show.html.erb
functional_test.rb  layout.html.erb  view_edit.html.erb  view_new.html.erb

rails2.0なのでhtml.erbなので

vi /opt/rubygems/gems/openid_login_generator-0.1/openid_login_generator.rb

のそのへんを直す。

      # Layout and stylesheet.
#      m.template "scaffold:layout.rhtml", "app/views/layouts/scaffold.rhtml"
      m.template "scaffold:layout.html.erb", "app/views/layouts/scaffold.html.erb"
      m.template "scaffold:style.css", "public/stylesheets/scaffold.css"

      # Views.
      m.directory File.join("app/views", class_path, file_name)
      login_views.each do |action|
#        m.template "view_#{action}.rhtml",
#          File.join("app/views", class_path, file_name, "#{action}.rhtml")
        m.template "view_#{action}.html.erb",
          File.join("app/views", class_path, file_name, "#{action}.html.erb")

で、再度じぇねったら今度は、

No such file or directory - /opt/rubygems/gems/openid_login_generator-0.1/templates/view_welcome.html.erb

といわれた。うぜぇ。。
Viewの方はrhtmlのままでした。。

$ ls /opt/rubygems/gems/openid_login_generator-0.1/templates/
README          controller_test.rb      user.rb       view_login.rhtml
controller.rb   helper.rb               user_test.rb  view_logout.rhtml
controller.rb~  openid_login_system.rb  users.yml     view_welcome.rhtml

なので、さっきのgeneratorのファイルはViewsの方は元に戻す。
で、generateできた

$ ./script/generate openid_login account
      create  lib/openid_login_system.rb
      create  app/controllers/account_controller.rb
      create  test/functional/account_controller_test.rb
      create  app/helpers/account_helper.rb
      create  app/models/user.rb
      create  test/unit/user_test.rb
      create  test/fixtures/users.yml
      create  app/views/layouts/scaffold.html.erb
      create  public/stylesheets/scaffold.css
      exists  app/views/account
      create  app/views/account/welcome.rhtml
      create  app/views/account/login.rhtml
      create  app/views/account/logout.rhtml
      create  README_LOGIN

テーブルとか作る

app/models/user.rb
ができたので、usersを作る
modelとかはもうあるからn

$ script/generate model user openid_url:string
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
overwrite app/models/user.rb? (enter "h" for help) [Ynaqdh] n
        skip  app/models/user.rb
overwrite test/unit/user_test.rb? (enter "h" for help) [Ynaqdh] n
        skip  test/unit/user_test.rb
overwrite test/fixtures/users.yml? (enter "h" for help) [Ynaqdh] n
        skip  test/fixtures/users.yml
      create  db/migrate
      create  db/migrate/001_create_users.rb

migrateファイルできたから、migration

$ rake db:migrate
(in /home/coek/dev/rails/form_storm)
== 1 CreateUsers: migrating ===================================================
-- create_table(:users)
   -> 0.0921s
== 1 CreateUsers: migrated (0.0953s) ==========================================

で準備完了

アクセスしてみる

http://localhost:3000/account/loginにアクセスしてみる

NoMethodError in AccountController#login

undefined method `require_gem' for main:Object

RAILS_ROOT: /home/coek/dev/rails/form_storm
Application Trace | Framework Trace | Full Trace

app/controllers/account_controller.rb:7

require_gemがダメ
それとか、rails2でダメになったとこを直す。

controllerは
require_gemの修正と
@params,@request,@sessionを@外す

#  require_gem "ruby-openid", ">= 1.0.2"
  gem "ruby-openid", ">= 1.0.2"

modelはfind_firstをfind_by_openid_url

-    find_first(["openid_url = ?", openid_url])
+    find_by_openid_url(openid_url)

viewは<%= start_form_tag :action=> "login" %>を

<% form_tag  :action=> "login" do %>
#中略
<% end %>

に修正

再度http://localhost:3000/account/loginにアクセス

login画面が表示された。

うごかね

はてなのアカウントで試してみたけど
なんかうまくいかね。。

OpenID2.0ライブラリに合わせて、account_controller.rbを修正


gemのrequireのVERSION直す

# load the openid library
begin
  require "rubygems"
#  require_gem "ruby-openid", ">= 1.0.2"
  gem "ruby-openid", ">= 2.0.3"
rescue LoadError
  require "openid"
end

↑だとダメみたい。。
exampleに合わせて

require 'pathname'

require "openid"
require 'openid/extensions/sreg'
require 'openid/extensions/pape'
require 'openid/store/filesystem'

loginは大幅に変更
http://www.mashupedia.jp/docs/view/79

def 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] = "Authorization failed."
		end
	end
end

request.statusとかerrorになったからだいぶAPIの中身が変わってるのかな。。

completeの
consumer.completeの引数が2つになってる

    #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)

OpenID::SUCCESSとかをOpenID::Consumer::SUCCESSにした

OpenID::Consumer::SUCCESS

consumerのstoreを直す

  def consumer
    # create the OpenID store for storing associations and nonces,
    # putting it in your app's db directory
    store_dir = Pathname.new(RAILS_ROOT).join('db').join('openid-store')
    #store = OpenID::FilesystemStore.new(store_dir)
    store = OpenID::Store::Filesystem.new(store_dir)

    return OpenID::Consumer.new(session, store)
  end

ここはAR使うようにもできるみたい。

で、一応動いた。

/opt/rubygems/gems/ruby-openid-2.0.3/example
は、もうちょっと、違うこともやってるっぽいのでそっちも見てみる。

参考

っーかまんま写しただけみたいな。

RailsでOpenIDを使う(コンシューマ編)
http://www.machu.jp/diary/20071124.html#p01

Rails で OpenID を使う (OpenID::Consumer#begin を読もう編)
http://www.machu.jp/diary/20071125.html#p01

もうみんなOpenIDに。
http://d.hatena.ne.jp/yune_kotomi/20071111/1194796903

斜め読み OpenID Simple Registration Extension 1.0
http://d.hatena.ne.jp/ZIGOROu/20070323/1174631045

OpenIDライブラリの導入
http://www.mashupedia.jp/docs/view/79