Rails 5.0.0beta3:ActionController::InvalidAuthenticityToken 开发中
Rails 5.0.0beta3: ActionController::InvalidAuthenticityToken in development
我刚刚在 Rails 5.0.0beta3 上启动了一个带有几个表单的简单应用程序。
在开发中,在 Safari 上使用 http://localhost:3000 或 Chrome 访问应用程序,如果我填写并提交表单,我总是会收到 ActionController::InvalidAuthenticityToken
错误。
但是,如果我在填写和提交之前重新加载页面,那么它就可以正常工作。
该应用使用默认值:
protect_from_forgery with: :exception
在 ApplicationController 中,
<%= csrf_meta_tags %>
in html header 通过应用布局,
- 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
) 中禁用 per form CSRF 令牌,它工作正常,所以我的问题确实在那个级别。
session 似乎在任何时候都没有被重置。
有趣的是,首次加载表单时,header 的 menage 标签中的真实性令牌与表单中的令牌不同。元标记也位于 header 标记的底部。
当我重新加载元标记和表单中的标记时,元标记位于 header 标记的顶部。
更新:
我认为问题出在 Turbolinks 上。
当从应用程序中的另一个页面访问表单页面时,Turbolinks 会触发 XHR 请求,我遇到了这个问题。
但是,当我重新加载页面时,浏览器会重新加载它,但我没有发现问题。
我在 Rails 上提出了一个问题。
经过进一步调查,问题似乎是由 form_for
中的选项 :url
引起的。
参见:Issue #24257(尚未解决)
您可以尝试 运行 rails dev:cache
,如此处所述 https://github.com/heartcombo/devise/issues/5273
我也试过了,它在三台不同的机器上对我有用,包括 Windows WSL 和 Ubuntu 20.04.
不过,我仍在努力找出它解决问题的原因。
我刚刚在 Rails 5.0.0beta3 上启动了一个带有几个表单的简单应用程序。
在开发中,在 Safari 上使用 http://localhost:3000 或 Chrome 访问应用程序,如果我填写并提交表单,我总是会收到 ActionController::InvalidAuthenticityToken
错误。
但是,如果我在填写和提交之前重新加载页面,那么它就可以正常工作。
该应用使用默认值:
protect_from_forgery with: :exception
在 ApplicationController 中,<%= csrf_meta_tags %>
in html header 通过应用布局,- 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
) 中禁用 per form CSRF 令牌,它工作正常,所以我的问题确实在那个级别。
session 似乎在任何时候都没有被重置。
有趣的是,首次加载表单时,header 的 menage 标签中的真实性令牌与表单中的令牌不同。元标记也位于 header 标记的底部。 当我重新加载元标记和表单中的标记时,元标记位于 header 标记的顶部。
更新:
我认为问题出在 Turbolinks 上。
当从应用程序中的另一个页面访问表单页面时,Turbolinks 会触发 XHR 请求,我遇到了这个问题。
但是,当我重新加载页面时,浏览器会重新加载它,但我没有发现问题。
我在 Rails 上提出了一个问题。
经过进一步调查,问题似乎是由 form_for
中的选项 :url
引起的。
参见:Issue #24257(尚未解决)
您可以尝试 运行 rails dev:cache
,如此处所述 https://github.com/heartcombo/devise/issues/5273
我也试过了,它在三台不同的机器上对我有用,包括 Windows WSL 和 Ubuntu 20.04.
不过,我仍在努力找出它解决问题的原因。