Rails 5.0.0beta3:ActionController :: InvalidAuthenticityToken正在开发中

时间:2016-03-20 11:06:07

标签: ruby-on-rails csrf-protection actioncontroller ruby-on-rails-5

我刚刚在Rails 5.0.0beta3上创建了一个带有几个表单的简单应用程序。

在开发中,使用Safari或Chrome上的http://localhost:3000访问应用,如果我填写表单并提交,我总会收到ActionController::InvalidAuthenticityToken错误。 但是,如果我在填写并提交之前重新加载页面,那么它可以正常工作。

该应用使用默认值:

    ApplicationController中的
  • protect_from_forgery with: :exception
  • <%= csrf_meta_tags %>在html标题中通过应用程序布局,
  • 由rails创建的开发环境。

示例:

<%= form_for @node, url: admin_book_nodes_url, as: :node do |form| %>
  <%= render "form", f: form %>
  <p><%= form.submit %> or <%= link_to "Cancel", admin_book_nodes_path %></p>
<% end %>

日志:

Started POST "/admin/book/nodes" for ::1 at 2016-03-20 11:54:31 +0000
Processing by Admin::Book::NodesController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"/G5pF6hSPx0Vf21Fi0FCh+VlOcHY4w8C5lmHmwr3NQRjfXUP9/xboybeV3tevmyTyHcwSX8LplU/HgZVGDbGlw==", "node"=>{"parent_id"=>"1", "position"=>"1", "title"=>"lkjlkj", "description"=>"lkjlj", "published"=>"0", "content"=>"lkjlkj"}, "commit"=>"Create node"}
Can't verify CSRF token authenticity
Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms)

如果我在控制器(self.per_form_csrf_tokens = false)中禁用每个表单CSRF令牌,它可以正常工作,所以我的问题确实在那个级别。

会话似乎不会在任何时候重置。

有趣的是,首次加载表单时,标题的menage标记中的真实性标记与表单中的标记不同。元标记也位于标题标记的底部。 当我重新加载标记时,元标记和表单中的标记相同,并且元标记位于标题标记的顶部。

更新

我认为问题归咎于Turbolinks。

当从应用程序中的另一个页面访问表单页面时,Turbolinks会触发XHR请求,我遇到了这个问题。

然而,当我重新加载页面时,浏览器会重新加载它,而我却看不到问题。

2 个答案:

答案 0 :(得分:6)

我在Rails上提出了一个问题。

经过进一步调查后,问题似乎是由:url中的选项form_for引起的。

请参阅:Issue #24257(尚未解决)

答案 1 :(得分:0)

您可以尝试按https://github.com/heartcombo/devise/issues/5273此处所述运行res = [] extra_val = '#' max_len = float('-inf') for each in l: max_len = max(max_len, len(each)) for each in l: if len(each) < max_len: n = max_len - len(each) extra_list = [extra_val]*n each.extend(extra_list) for i in range(max_len): for j in range(len(l)): if l[j][i] != extra_val: res.append(l[j][i]) print(res)

我也尝试过,它已经在三台不同的机器上为我工作,其中包括带有Ubuntu 20.04的Windows WSL。

尽管如此,我仍在设法解决它解决问题的原因。