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

Ruby on rails 表单真实性令牌正在更改,ruby-on-rails,ruby,ruby-on-rails-4,devise,Ruby On Rails,Ruby,Ruby On Rails 4,Devise,我使用的是Rails 4,我使用的是普通的form\u forhelper,它呈现一个隐藏元素,该元素存储form\u真实性\u标记值 现在,当我执行POST请求时,我得到了ActionController::InvalidAuthenticityToken错误。这些是我的请求参数 {"utf8"=>"✓", "authenticity_token"=>"euVcp8lEVyg3JZVZeMGI0G2SV4y8Jukmz9GUv6ZO34I=", "confirmation_

我使用的是Rails 4,我使用的是普通的
form\u for
helper,它呈现一个隐藏元素,该元素存储
form\u真实性\u标记

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

{"utf8"=>"✓", "authenticity_token"=>"euVcp8lEVyg3JZVZeMGI0G2SV4y8Jukmz9GUv6ZO34I=",     "confirmation_token"=>"jLdtGNf5fWnDiEjV5xDU", "user"=>{"password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Activate"}
我的
application.html.erb
也包含

因此,我将调试器放在源代码中,发现
form\u authenticity\u token
的值现在被更改为其他值,它与请求参数中
authenticity\u token
的值不同&因此
verify\u authenticity\u token
会引发错误

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

更新 首先,当我尝试打印
会话时,我得到

#<Rack::Session::Abstract::SessionHash:0x15cb970 not yet loaded>
#
然后我通过执行
会话[:a]=:b

然后我发现
session[:\u csrf\u token]
的值是
nil
&因此该值被更改,因为生成了一个与我的表单值不匹配的新随机值


现在我需要找出为什么它是
nil

您能解释一下为什么要更改真实性令牌的值吗?我假设您将其保存在以下表格中:

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


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

可能对将来的任何人都有帮助,以下是我出现问题的原因,我有以下代码

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
请求,因此会话的
\u csrf\u令牌
nil


当我通过实际访问
example.com:3000
上的应用程序执行
POST
请求时,它工作得非常好

我们也遇到了这个问题,但我们注意到只有在使用http://并且在https://上工作正常时才会出现这个问题。因此,我们强制我们的应用程序使用HTTPS:)

原因:session\u存储区有这样的
secure:true

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

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

post请求来自javascript/ajax吗?不,简单的旧rails Way我刚刚用新的information@Anthony如果您感兴趣的话,我发现了这个问题。我不会更改它,该方法来自rails源代码。是的,真实性令牌在隐藏字段中,它是由rails通过我发现解决方案的方式生成的!很有趣
Rails.application.config.session_store(
  :cookie_store,
  key: '_foo_session',
  domain: '.example.com',
  secure: true
)