2010-07-17 73 views
2

我正在玩Rayan Bates http://railscasts.com/episodes/170-openid-with-authlogic來源爲基礎。因此,我爲OpenID提供商創建了幾個圖標,例如Google,Yandex,OpenID,用戶必須選擇使用哪一個(在此類似於stackoverflow)。所以一切都很好。現在我決定只進行一次點擊登錄或註冊:當用戶點擊圖標Authlogic必須創建新用戶並對其進行身份驗證時,或者,如果用戶存在,只需對其進行身份驗證即可。所以我綁改變用戶#邏輯創建:Authlogic和OpenID註冊和登錄在一個動作

class UsersController < ApplicationController  
    def create 
    @user = User.new(params[:user]) 
    @user.save do |result| 
     if result 
     redirect_to root_url 
     else 
     @user_session = UserSession.new(:openid_identifier => @user.openid_identifier) 
     @user_session.save 
     redirect_to root_url 
     end 
    end 
    end 
end 

所以,如果用戶不能保存Authlogic將嘗試驗證他(當然,用戶不能保存,不僅是否存在另一個用戶與相同的openid_identifier,但只是例如)。但是這些方案是行不通的。在這種情況下什麼也沒有發生,@user_session.save什麼也沒有返回。

UPD

展望Shripadķ鏈接源(http://github.com/shripadk/authlogic_openid_selector_example/blob/master/app/models/user_session.rb)我已經搭上了這一點:

class UserSession < Authlogic::Session::Base 
    auto_register 
end 

auto_register是我所需要的

回答

1

而不是另起爐竈,你可以在此給出一個嘗試:http://github.com/shripadk/authlogic_openid_selector_example

活生生的例子應用:http://testingauth.heroku.com/

+0

看起來很有趣。去看看 – fl00r 2010-07-18 08:32:18

+0

好吧,我明白了:UserSession模型中的'auto_register'就足夠了! – fl00r 2010-07-18 09:03:04

+1

'auto_register'中存在一個錯誤。事實上,我已經用提交來修補我的應用程序。看看最新的提交。當你使用auto_register而不使用補丁時,它不會從open-id提供程序返回電子郵件地址(或任何sreg/ax)! – 2010-07-18 11:10:44

0

埃姆。正如我不能重定向POST到user_sessions創建行動,所以我已經砍了這樣:

class UsersController < ApplicationController 
    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(params[:user]) 
    @user.save do |result| 
     if result 
     redirect_to root_url 
     else 
     if User.find_by_openid_identifier(@user.openid_identifier) 
      redirect_to :action => 'login', "user_session[openid_identifier]" => @user.openid_identifier 
     else 
      render :action => "new" 
     end 
     end 
    end 
    end 

    def login 
    @user_session = UserSession.new(params[:user_session]) 
    @user_session.save do |result| 
     if result 
     redirect_to root_url 
     else 
     render :action => 'new' 
     end 
    end  
    end 
end