【问题标题】:Rails How to send an Authenticity Token in an Ajax Request without a form involved?Rails 如何在不涉及表单的情况下在 Ajax 请求中发送 Authenticity Token?
【发布时间】:2017-06-05 00:27:10
【问题描述】:

出于多种原因,我需要通过 Ajax 向控制器发送一个发布请求,而我不能通过表单来完成,它必须是一个 JS Ajax 请求,它写在 assets > javascript 文件中或标签之间。

我编写了一个似乎可以正确传递数据的函数。但是,它没有传递有效的 Authenticity Token,因此不允许请求通过。

有没有办法遵守 CSRF 保护生成令牌以便控制器满意?

到目前为止,我的 Ajax 函数是:

  var functionOne = function() {
  var $form = $('#'  + tinyMCE.activeEditor.formElement.id);
  var action = $form.attr('action')
  $.ajax({
    method: "POST",
    url: action,
    data: $form.serialize(),
    dataType: 'script',
  });
};

此表单正在传递以下参数

{"utf8"=>"✓", "_method"=>"patch", "open_ender"=>
  {"answer_id"=>"4",
  "content"=>"<p>testing text</p>"},
  "id"=>"5"}

我尝试在 Ajax 对象中包含以下行

authenticity_token: $('meta[name=csrf-token]').attr('content'),

这在应用程序布局头中没有成功

$(function(){
  $.ajaxSetup({
  headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') }
  });
});

更新

Appart 来自 Aniket 的解决方案。添加

authenticity_token: true 

在表单选项哈希中也解决了这个问题

【问题讨论】:

    标签: jquery ruby-on-rails ajax authenticity-token


    【解决方案1】:

    只需在表单中传递一个带有真实性令牌值的隐藏字段,这应该可以工作。

    <%= f.hidden_field :authenticity_token, value: form_authenticity_token %>
    

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

    【讨论】:

    • 嗨 Aniket,谢谢它有效。虽然我使用的是简单的形式,但我在上面添加了一行,Rails 不再抱怨。但是,现在它归咎于 ActionController::UnknownFormat。这很奇怪,因为表单设置为 remote: true 并且我的控制器正在使用 JS 进行响应,如果我使用提交按钮提交表单,它就可以工作。关于问题的任何线索。
    • 顺便说一句,CSRF 问题似乎也可以通过在表单的选项哈希中添加authentity_token: true 来解决。可能与 tinyMCE 的工作方式有关,它干扰了 Rails 默认创建的真实性令牌。显然我太无知了,不知道到底发生了什么!
    【解决方案2】:
    Use the below:
    
      var functionOne = function() {
      var $form = $('#'  + tinyMCE.activeEditor.formElement.id);
      $form = $form.append('<input type = hidden name = "authenticity_token" value = "<%= form_authenticity_token %>">')
      var action = $form.attr('action')
      $.ajax({
        method: "POST",
        url: action,
        data: $form.serialize(),
        dataType: 'script',
      });
    };
    

    【讨论】:

    • Chakreshwar,非常感谢您的回答。我以前使用过 Aniket 的方法,它奏效了。我喜欢在 Ajax 请求中附加隐藏字段以使其更整洁的想法,尽管它不起作用。也许我没有准确地附加在最后一个文件或其他东西中。我也尝试过前置但没有成功。幸运的是,无论如何现在正在工作。谢谢
    猜你喜欢
    • 2017-09-15
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多