ruby-on-rails 表单真实性令牌正在更改

ryevplcw  于 2023-02-26  发布在  Ruby
关注(0)|答案(4)|浏览(110)

我使用的是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

taor4pac

taor4pac1#

您能解释一下为什么要更改真实性令牌的值吗?我假设您将其保持为如下形式:

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

有可能你的||=正在更改该值。我认为多了解一些有关您尝试执行的操作的信息将有助于诊断该问题。

5tmbdcev

5tmbdcev2#

可能有助于任何人在未来,这就是为什么我有问题,我有以下代码

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

在我的config/initializers/session_store.rb中,我不久前添加了domain:键来使用自定义域而不是localhost &完全忘记了这一点。
现在,使用此配置,我尝试通过在localhost:3000而不是example.com:3000加载应用程序来执行POST请求,因此会话的_csrf_tokennil
当我通过实际访问X1 M9 N1 X上的应用程序来执行X1 M8 N1 X请求时,它工作得非常完美!

zengzsys

zengzsys3#

我们也遇到过这个问题,但我们注意到它只在使用http://时发生,并且在https://上工作正常。所以我们强制我们的应用使用HTTPS:)
原因:session_store具有如下secure: true

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

这导致不具有会话/令牌的非安全请求。

zfciruhq

zfciruhq4#

我在Rails 7中也看到过这个问题,它是由一个表单嵌入到另一个表单中引起的。例如,您可能有:

<%= form_for ... %>
    <%= form_for ... %>
    <% end %>
<% end %>

但你本打算:

<%= form_for ... %>
<% end %>

<%= form_for ... %>
<% end %>

相关问题