在rails中设置令牌的超时

时间:2011-09-05 08:54:16

标签: ruby-on-rails authentication timeout devise token

如何为给定的身份验证令牌设置超时?超时后,令牌将被删除,用户将无法在其请求中使用它。

我正在使用rails 3并设计。

3 个答案:

答案 0 :(得分:4)

我也在寻找这个功能,但没有办法直接做到这一点。

您可以在每次登录时重置身份验证令牌,并使用中间可记住的值:

在应用程序控制器中,在after_sign_in_path_for():

resource.reset_authentication_token

在devise.rb中:

config.remember_for = 1.day

或者您可以创建一个cron-job来定期清除users表中的无效authentication_token条目。

答案 1 :(得分:2)

我不确定这是否正是您正在寻找的,但这是Devise中的一个简单选项。 如果在config / initializers / devise.rb中设置以下选项

config.timeout_in = 30.minutes

然后Devise应该在30分钟不活动后使令牌失效。 Devise为会话身份验证执行的操作也应该与身份验证令牌一起使用。

我在当前项目中使用过它并使用Timecop

进行测试
it "should timeout without activity after 30 minutes" do
    auth_token = @user.authentication_token

    get "/frontend/users/#{@user.id}.json?auth_token=#{auth_token}"
    response.status.should == 200

    Timecop.travel(45.minutes.from_now)
    get "/frontend/users/#{@user.id}.json?auth_token=#{auth_token}"
    response.status.should == 401 

    Timecop.return
end

此外,我不认为该令牌与其中一条评论中提到的用户/密码组合类似,因为您不会以纯文本形式存储密码,而是使用您的令牌。我建议在每次注销后重置令牌。

答案 2 :(得分:1)

设计初始化文件

#/config/initializers/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 = 1.day

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