覆盖rails authenticity_token设置

时间:2018-03-15 15:24:52

标签: ruby-on-rails authenticity-token

提交表单需要一个令牌,接收服务器已将其命名为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默认行为?

2 个答案:

答案 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是一个返回当前视图的助手 会话的真实性令牌。行动起来太迟了 布局可能已经调用它
  • most voted response有一种按行动方式 protect_from_forgery因内部目的忽略它。仍然 会议已经发布,为时已晚
  • a skip before action就像之前的解决方案一样 迟到,会话令牌被发出
  • 说明authenticity_token: 'external_token'
  • rails guide不正确

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;。 (愿意接受更好的一个!)