表格真实性令牌变更

时间:2014-11-09 17:22:03

标签: ruby-on-rails ruby ruby-on-rails-4 devise

我使用Rails 4,我使用普通的form_for助手,它会渲染一个存储form_authenticity_token值的隐藏元素。

现在,当我执行POST请求时,出现ActionController::InvalidAuthenticityToken错误。这些是我的请求参数

{"utf8"=>"✓", "authenticity_token"=>"euVcp8lEVyg3JZVZeMGI0G2SV4y8Jukmz9GUv6ZO34I=",     "confirmation_token"=>"jLdtGNf5fWnDiEjV5xDU", "user"=>{"password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Activate"}

我的application.html.erb还包含<%= csrf_meta_tags %>

因此,我将调试器放在源代码中,发现form_authenticity_token的值现在已更改为其他内容与authenticity_token&#39; s不同请求参数中的值&amp;因此verify_authenticity_token会引发错误。

我不知道为什么要改变这个值。

更新

def form_authenticity_token
  session[:_csrf_token] ||= SecureRandom.base64(32)
end

首先,当我尝试打印session时,我得到了

#<Rack::Session::Abstract::SessionHash:0x15cb970 not yet loaded>

然后我通过session[:a] = :b

强制加载

然后我发现session[:_csrf_token]的值是nil&amp;因此,值会发生变化,因为会生成一个与我的表单值不匹配的新随机值。

现在我需要找出原因nil

3 个答案:

答案 0 :(得分:0)

你能解释一下为什么要改变真实性令牌的价值?我假设你把它保存在以下形式:

<input type="hidden" name="authenticity_token" value="<%= form_authenticity_token %>">

您的|| =可能正在更改该值。我想更多关于你想要做什么的信息将有助于诊断问题。

答案 1 :(得分:0)

将来可能对任何人有帮助,这就是我遇到问题的原因,我有以下代码

Rails.application.config.session_store :cookie_store,
                                       key: '_foo_session',
                                       domain: '.example.com'

在我的config/initializers/session_store.rb内,我刚刚添加domain:密钥以使用自定义域而不是localhost&amp;完全忘了它。

现在,通过此配置,我尝试通过POST而不是localhost:3000加载应用程序来执行example.com:3000请求,因此会话_csrf_tokennil

当我通过实际访问POST上的应用来完成example.com:3000请求时,它完美无缺!

答案 2 :(得分:0)

我们也有这个问题,但是我们注意到只有在使用http://并且在https://上正常工作时才会发生这种情况。所以我们强迫我们的应用程序使用HTTPS:)

原因:session_store有secure: true这样的

Rails.application.config.session_store(
  :cookie_store,
  key: '_foo_session',
  domain: '.example.com',
  secure: true
)

导致非安全请求没有会话/令牌。