我使用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
答案 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_token
是nil
。
当我通过实际访问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
)
导致非安全请求没有会话/令牌。