提交表单需要一个令牌,接收服务器已将其命名为authenticity_token
,并期望只知道发布和接收服务器的字符串:
<input id="authenticity_token" name="authenticity_token" type="hidden" value="ac513de198a9f0536df5003fb5ba3122d1ee53d5" />
如果我调用实例或全局变量,则该值呈现。但是,即使控制器设置了以下过滤器:
skip_before_action :verify_authenticity_token, only: [:reservation]
我是否尝试
<%= form_tag('https://test.webten.net/form') do %>
<%= hidden_field_tag :authenticity_token, @ppayment.authenticity_token, id: "authenticity_token" %>
或
<%= tag(:input, type: "hidden", name: request_forgery_protection_token.to_s, value: @ppayment.authenticity_token) %>
或
<input id="" name="authenticity_token" type="hidden" value="ac513de198a9f0536df5003fb5ba3122d1ee53d5" />
Rails最终用自己的会话设置值压缩每个值并渲染:
<input type="hidden" name="authenticity_token" id="authenticity_token" value="ydi5En1ywUkN5VsYIBXu6JTbQmXtwxNhpKlyjbbLi3RdvCc+A59EdDZvroGsGFplAAE5ATLcSqw25LVQkyPtKw==">
<input type="hidden" name="authenticity_token" value="ydi5En1ywUkN5VsYIBXu6JTbQmXtwxNhpKlyjbbLi3RdvCc+A59EdDZvroGsGFplAAE5ATLcSqw25LVQkyPtKw==">
<input id="authenticity_token" name="authenticity_token" type="hidden" value="ydi5En1ywUkN5VsYIBXu6JTbQmXtwxNhpKlyjbbLi3RdvCc+A59EdDZvroGsGFplAAE5ATLcSqw25LVQkyPtKw==">
如何在此控制器操作中覆盖rails默认行为?
答案 0 :(得分:0)
您必须覆盖:authenticity_token
调用中的form_tag
参数,以防止Rails默认添加会话的真实性令牌:
<%= form_tag('https://test.webten.net/form', authenticity_token: 'ac513de198a9f0536df5003fb5ba3122d1ee53d5') do %>
或:
<%= form_tag('https://test.webten.net/form', authenticity_token: false) do %>
<%= hidden_field_tag 'authenticity_token', 'ac513de198a9f0536df5003fb5ba3122d1ee53d5' %>
如果这不起作用,您可能会有一些JS覆盖您从META标记中提供的真实性令牌。搜索&#39; csrf-token&#39;在你的JS。
有关详细信息,请参阅http://guides.rubyonrails.org/form_helpers.html#forms-to-external-resources。
答案 1 :(得分:0)
[这个答案是对前一个答案的补充。它以一种不雅的方式解决了这个问题]
各种可能的解决方案似乎不完整/不合适
form_authenticity_token
是一个返回当前视图的助手
会话的真实性令牌。行动起来太迟了
布局可能已经调用它protect_from_forgery
因内部目的忽略它。仍然
会议已经发布,为时已晚authenticity_token:
'external_token'
Aaron Breckenridge
的回答提供了一个线索:&#34;你可能有一些JS覆盖真实性令牌&#34;,由this posting支持。因此,可以搜索app目录的内容,但仍然找不到JS处理程序......例如,jquery-ujs是gem安装的。基于观察到的行为,它必须在每次遇到name='authenticity-token'
时被激活并根据META标记设置值(逻辑。为什么在同一页面上有2个不同的标记......) - 正确地完成其工作!
从字面上看,该令牌不得在上游生成。所以修改布局的标题部分:
<% unless request.path == "/controller/action" %>
<%= csrf_meta_tags %>
<% end %>
是一个有效的解决方案。这种解决方案容易受到多种途径的污染。另一个需要多个布局处理...因此,文件在&#39; kludgey&#39;。 (愿意接受更好的一个!)