2009-07-24 78 views
17

我想在Rails中編寫一個簡單的OAuth使用者應用程序。我使用Authlogic處理身份驗證,使用Authlogic OAuth插件執行oauth操作。使用Authlogic和Authlogic OAuth插件創建隱式用戶

oauth插件提供了兩個助手來呈現登錄按鈕:oauth_login_button和oauth_register_button。與Authlogic邏輯和插件的請求過濾器一起,這兩個按鈕以某種方式創建會話/用戶。

接下來會發生什麼如下: - 如果我使用oauth_login_button助手,則會話對象無法保存,因爲本地沒有這樣的用戶。 - 如果我使用oauth_register_button助手,那麼在第一次登錄之後的任何登錄時,Rails會抱怨已經使用該令牌......這意味着它無法爲同一用戶創建第二個副本,這是正確的。

問題是:我不希望在我的網站上都有註冊和登錄按鈕。

在用戶方面,我想要實現的是開始頁面上的一個按鈕,說smth。如「使用Twitter登錄」,用戶必須點擊該按鈕才能進入網站的內部頁面。

在服務器端,如果用戶是第一次訪問我的站點,我想隱式創建本地用戶帳戶。

任何提示如何做到這一點?

所有的Authlogic + OAuth的樣品我能找到似乎並不關心其在只爲標誌的一個按鈕。:(

回答

11

好像我要回答這個問題我自己。

我使用下面的代碼來生成登錄按鈕(在HAML):

- form_tag({:controller => "users", :action => "create"}, {:method => "post"}) do 
    = oauth_register_button :value => "Sign In with Twitter" 

然後我簡單地創建在UsersController類的創建方法的用戶的會話對象時,如果用戶已經存在:

def create 
    @user = User.new(params[:user]) 
    @user.save do |result| # LINE A 
    if result 
     flash[:notice] = "Account registered!" 
     redirect_to some_inner_path 
    else 
     unless @user.oauth_token.nil? 
     @user = User.find_by_oauth_token(@user.oauth_token) 
     unless @user.nil? 
      UserSession.create(@user) 
      flash.now[:message] = "Welcome back!" 
      redirect_to some_inner_path   
     else 
      redirect_back_or_default root_path 
     end 
     else 
     redirect_back_or_default root_path 
     end 
    end 
    end 
end 

如果用戶是第一次訪問者,那麼用戶對象已成功保存在LINE A中。如果不是,並且存在可用的oauth令牌,那麼我們嘗試從DB獲取用戶並記錄日誌他/她在。

+0

正是我剛纔找的。謝謝 – 2009-10-19 22:06:30