无效的真实性令牌

时间:2016-06-10 16:20:59

标签: ruby-on-rails ajax

我在视图中创建了一个定期发送数据的AJAX:

$.ajax({
      type: "PATCH",
      url: "/drivers/" + <%= current_user.id %> + "/coordinates",
      data: data,
      success: postSuccess
});

到:

  def update
    if @driver.update_attributes(driver_params)
      head :ok
    else
      render status: :unprocessable_entity, json: {
        error: @driver.errors
      }
    end
  end

这似乎在大多数情况下完美无缺。但有时它会被退回:

An ActionController::InvalidAuthenticityToken occurred in drivers#coordinates


Request:
-------------------------------

  * URL        : 
  * HTTP Method: PATCH
  * IP address : 
  * Parameters : {"latitude"=>"59.9", "longitude"=>"10.77", "controller"=>"drivers", "action"=>"coordinates", "id"=>"16"}
  * Timestamp  : 2016-06-10 17:55:56 +0200
  * Server : 
  * Rails root : /var/deploy/
  * Process: 6997

-------------------------------
Session:
-------------------------------

  * session id: [FILTERED]
  * data: {"session_id"=>"b08d5d2604631c91fc2db202",
   "_csrf_token"=>"3seCLYJYUuUX0JWlU8Z83frEE3HxA="}

这很奇怪,80%的时间这完美无缺。也许是它所做的更新率触发它,说实话我不确定。通常用户在一个页面上运行并在后台运行并更新其GEO坐标。

有人知道如何解决这个问题吗?有没有办法添加一个适用于AJAX的真实性令牌,如果是这样,它会多次工作(因为当它们在同一页面上时可以触发50-100次)。

1 个答案:

答案 0 :(得分:0)

如果您查看错误通知,它会生成此异常InvalidAuthenticityToken

这意味着您在没有auth-token的情况下触发POST / PATCH请求,默认情况下在ApplicationController中定义

protect_from_forgery with: :exception

你需要在这些参数中做些什么:

Parameters : {"latitude"=>"59.9", "longitude"=>"10.77", "controller"=>"drivers", "action"=>"coordinates", "id"=>"16"}

添加由view标记生成的标记:

<%= csrf_meta_tag %>

如果你使用jquery,你可以像这样抓住

$('meta[name=csrf-token]').attr('content');

您可以关闭CSRF保护,但除非您使用纯JSON API,否则我不会推荐。相反,当你执行$ .ajax时,将它添加到你的参数中。你可以使用这样的东西

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

或在你里面ajax调用

$.ajax({
...
  beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token',$('meta[name="csrf-token"]').attr('content'))}
...