2014-03-13 55 views
1

所以在我的Rails 4.0應用程序中,我使用Devise進行身份驗證管理,並且我注意到當我嘗試退出過期時出現500錯誤會話。我不確定問題出在哪裏。我看到一些不同的潛在來源:設計會議退出引發'無效的真實性令牌'異常

1)我不完全瞭解如何驗證真實性標記,但我的理解是它來自會話存儲中的某些內容。在這種情況下,我的會話存儲器配置如下:

*配置/初始化/ session_store.rb *

MyApp::Application.config.session_store ActionDispatch::Session::CacheStore, :expire_after => 20.minutes 

當我註銷並收到此錯誤,20分鐘以上的通過,所以我的會議應該在緩存中過期。我不想增加這個數字,只是爲了能夠退出我的會話。這似乎沒有多大意義。

2)另一種可能性是在Devise的配置中。我正在使用Devise Timeoutable模塊的默認設置,如下所示。

配置/初始化/ devise.rb

# ==> Configuration for :timeoutable 
# The time you want to timeout the user session without activity. After this 
# time the user will be asked for credentials again. Default is 30 minutes. 
config.timeout_in = 30.minutes 

# If true, expires auth token on session timeout. 
config.expire_auth_token_on_timeout = false 

我會假設,設計將足夠聰明來檢查令牌已經過期,只是通過我通過,如果是的。否則,它試圖摧毀一個零會話,這再次沒有任何意義。

3)最後的可能性是Devise會話控制器本身。也許我需要把這樣的:

skip_before_filter :verify_authenticity_token, :only => [:destroy] 

我認爲會的工作,但感覺就像一個黑客對我因爲設計就是這樣一個很好用的寶石,我不能成爲唯一的人誰是這樣做。如果我需要這樣做,我會認爲我在做別的事情。

有沒有人遇到過這個問題?自從升級到Rails 4.0(Running Devise 3.2.2)以來,我只遇到過這個問題。我沒有Rails 3.2(Running Devise〜> 3.1.0)的這個問題。

我主要是試圖避免我的用戶在嘗試從無人蔘與的會話中註銷時看到Server 500錯誤,並且正在尋找處理它的「正確」方式。有任何想法嗎?

回答

1

我有同樣的問題(但它剛剛嘗試了我的應用程序與IE瀏覽器...只是一個案件,但誰知道ahahah)。

我最終爲所有創建和銷燬會話的表單添加了一個隱藏字段,因爲從那以後我經常會遇到這個問題(主要是,如果我爲我的不同模型創建會話 - 用戶和管理員),它似乎工作,即使它對我來說也是一種破綻。

<%= tag(:input, :type => "hidden", :name => request_forgery_protection_token.to_s, :value => form_authenticity_token) %>

無論如何,我優選該溶液在應用控制器跳過濾波器。還要檢查這個問題:Rails 4 Authenticity Token

希望它有助於

+0

我很欣賞的反饋。就我而言,我並未提交表單。我只是調用方法類型DELETE的鏈接。我想我可以把它切換到一個表格,但這是很多開銷。從你鏈接的文章我試圖切換我的application_controller.rb使用'protect_from_forgery::null_session'而不是':exception'。也許這將解決我的問題,不知道我通過做出這樣的改變而放棄了安全。 –

+0

理論上,它不應該是一個安全問題變爲:null_session,但它主要用於API調用。你應該試試看,因爲這是一個非常令人失望的例外。 – sissy

+2

爲了解決這個問題,將其更改爲:null_session不再導致它拋出真實性標記異常。 –

0

添加您的應用程序控制器

protect_from_forgery有:reset_session

相關問題