我使用的是Rails4,我使用的是普通的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
的值不同,因此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
&因此这个值被改变了,因为生成了一个新的随机值,它和我的表单值不匹配。
现在我需要找出它为什么是nil
4条答案
按热度按时间taor4pac1#
您能解释一下为什么要更改真实性令牌的值吗?我假设您将其保持为如下形式:
有可能你的||=正在更改该值。我认为多了解一些有关您尝试执行的操作的信息将有助于诊断该问题。
5tmbdcev2#
可能有助于任何人在未来,这就是为什么我有问题,我有以下代码
在我的
config/initializers/session_store.rb
中,我不久前添加了domain:
键来使用自定义域而不是localhost
&完全忘记了这一点。现在,使用此配置,我尝试通过在
localhost:3000
而不是example.com:3000
加载应用程序来执行POST
请求,因此会话的_csrf_token
是nil
。当我通过实际访问X1 M9 N1 X上的应用程序来执行X1 M8 N1 X请求时,它工作得非常完美!
zengzsys3#
我们也遇到过这个问题,但我们注意到它只在使用http://时发生,并且在https://上工作正常。所以我们强制我们的应用使用HTTPS:)
原因:session_store具有如下
secure: true
这导致不具有会话/令牌的非安全请求。
zfciruhq4#
我在Rails 7中也看到过这个问题,它是由一个表单嵌入到另一个表单中引起的。例如,您可能有:
但你本打算: