Random ActionController :: InvalidAuthenticityToken

时间:2017-01-18 11:42:27

标签: ruby-on-rails session csrf

我的生产服务器上出现随机ActionController::InvalidAuthenticityToken错误。没有AJAX请求,所有表单都是使用Rails助手创建的(因此它们包含带有authenticity_token的隐藏字段)。

问题在随机表格中随机出现。

ApplicationController before_action :expires_nowRails.application.config.session_store :cookie_store, key: '_myapp_session' 。这可能是个问题吗?我添加了这个,因为我的用户经常点击“返回”。在他们的浏览器中我并不希望他们缓存结果。

我的session_store.rb初始化程序如下所示:

timeoutable

如果这有任何区别,我会将Devise与config.timeout_in模块一起使用,并将1.hour设置为class ApplicationController < ActionController::Base include Pundit rescue_from Pundit::NotAuthorizedError, with: :not_authorized protect_from_forgery with: :exception add_flash_types :success, :warning, :danger, :info before_action :authenticate_user! before_action :set_current_user before_action :set_cache_headers def after_sign_out_path_for(_user) tasks_path end def not_authorized flash[:warning] = 'You are not authorized to execute this action.' redirect_to tasks_path end private def set_current_user User.current = current_user end def set_cache_headers response.headers['Cache-Control'] = 'no-cache, no-store' response.headers['Pragma'] = 'no-cache' response.headers['Expires'] = 'Fri, 01 Jan 1990 00:00:00 GMT' end end

我正在使用Rails 5.0.1。

application_controller.rb:

import random

print("Dice Game: try to roll a bigger number than the computer! Good luck!")

print("Type 'go' to roll")
dieroll = input()
if dieroll == 'go':
    myNumber = random.randint(1,6)
    pcNumber = random.randint(1,6)
    print("You rolled " + str(myNumber))
    print("He rolled " + str(pcNumber))
    if myNumber < pcNumber:
        print("You lose!")
    if pcNumber < myNumber:
        print("You win!")

1 个答案:

答案 0 :(得分:0)

是你的before_action:expires_now会导致问题。因为每个进入的请求都会使用户会话到期。

而你可以做的是

class ApplicationController < ActionController::Base
  before_action :set_cache_headers

    private

      def set_cache_headers
        response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
        response.headers["Pragma"] = "no-cache"
        response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
      end
    end

这将解决您的后退按钮问题。

另一个问题是用户会话在闲置一小时后会超时。一旦超时,您将在服务器端注销,但是客户端此时不知道有关正在计时/注销的会话。因此,您的问题的解决方案是通知客户端有关超时并重定向到登录页面。

检查automatic logout after inactivity/idle以获取更多信息第二个答案。