2010-12-17 62 views
18

所以,我剛剛通過https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview使用Rails 3,Devise和OmniAuth進行了設置。Devise和OmniAuth記住OAuth

我成功地通過Facebook認證用戶,但他們不是 「rememberable」 儘管被打上:

devise [...]: rememberable, :omniauthable 

我打過電話:

@the_user.remember_me! 

...無濟於事。沒有cookie被存儲/設置,這意味着用戶不會在會話中持續存在。

有沒有人設法得到一個來自FB記住通過cookie的用戶?在我看來,這應該會自動發生。

感謝您的任何想法或反饋,你們可能有。

回答

11

我同意你會希望在請求進入FB之前設計一個會話。我想這是Devise的一個缺失功能​​。

我自己在使用token_authenticatable的地方遇到了問題。一個API客戶端直接調用下面的網址:

/users/auth/facebook?auth_token=TnMn7pjfADapMdsafOFIHKgJVgrBEbjKqrubwMXUca0n16m3Hzr7CnrP1s4z 

由於我使用token_authenticatable我是假設這會在用戶登錄。不幸的是,這並不適用。你需要做的就是確保用戶在到達此路徑之前登錄。你可以用其他方式來完成,但最簡單的方法是給API客戶端提供一個不同的URL(在這個例子中是「users/connect/facebook」),這是我對路由文件的補充,與設計一個用戶模型,您沒有更改默認設置):

authenticate :user do 
    get 'users/connect/:network', :to => redirect("https://stackoverflow.com/users/auth/%{network}") 
end 

這將確保會議正確地創建,所以當他/她從Facebook返回用戶所認可

+0

你是如何給API客戶端另一個URL的?在config/initializers/devise.rb中的某處? – 2011-05-12 20:24:52

19

我。 d想詳細說明(正確的)答案@ jeroen-van-dijk給出了上面爲我工作的答案

在config/routes.rb中,在devise_for塊:

devise_for :users, :controllers => { 
        :omniauth_callbacks => "user_omniauth_callbacks" } do 
    ... 
    get '/users/connect/:network', :to => redirect("https://stackoverflow.com/users/auth/%{network}"), 
           :as => 'user_oauth_connect' 

end 

然後改變你的 「登錄使用Facebook的」 鏈接,以使用新航線:

<!-- before it linked to user_omniauth_authorize_path --> 
<%= link_to "Sign in using Facebook", user_oauth_connect_path(:facebook) %> 

在應用程序/控制器/ user_omnniauth_callbacks_controller.rb

class UserOmniauthCallbacksController < Devise::OmniauthCallbacksController 
    include Devise::Controllers::Rememberable 

    def facebook 
    @user = User.find(...) 
    ... 
    remember_me(@user) # set the remember_me cookie 
    end 
end 

這個解決方案工作得很好對於我來說,使用Rails 3.1和Devise 1.4.9。

+0

我錯過了對控制器上的remember_me的調用,而不是最初的模型。最後在包含正確的模塊之後纔開始工作。 – 2012-10-05 04:32:32

+0

On Rails 3.2.3和Devise 2.1.2,添加「include」行和「remember_me()」調用就足夠了。我不必更改任何路由。 – 2013-09-03 18:52:07

+0

@haraldmartin我嘗試了所有解決方案,但它們不適用於我,我在以下文章中打開一個新問題。你可以幫我嗎?謝謝Fabrizio http://stackoverflow.com/questions/42280622/devise-omniauth-facebook-rememberable – 2017-02-16 17:19:28

0

僅供參考 - 如果你想同時使用extend_remember_period功能中色器件 - 你需要在迫使這個在回調控制器

用戶對象添加一行@ mustafaturan的回答

user.remember_me = true 
user.extend_remember_period = true 

# then add your signing in code 
sign_in(:user, user)