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