如何关闭仅用于json的rails protect_from_forgery过滤器

kat*_*uya 5 ajax rest json ruby-on-rails protect-from-forgery

我有使用Rails3构建的网站,现在我想实现用于移动客户端访问的json API.但是,由于protect_from_forgery过滤器,从客户端发送json post请求.因为客户端不会从服务器检索任何数据,所以客户端无法接收auth_token,因此我只想为json请求关闭protect_from_forgery选项(我认为rails3在默认情况下执行此操作,但显然它没有) .

我知道在这里讨论类似的主题,但在这种情况下,他在发送帖子请求之前收到auth_token.

所以我的问题是只关闭json的protect_from_forgery是这样做的好方法吗?如果是,怎么办?如果不是,还有什么选择?

仅供参考,我使用以下ajax请求

$.ajax({
             type: 'POST',  
             url: "http://www.example.com/login.json",  
             data: { 'email': emailVal, 'password': passwordVal },  
             success: onSuccess,  
             error: onError,  
             dataType: "json"  
});
Run Code Online (Sandbox Code Playgroud)

我得到ActionController :: InvalidAuthenticityToken错误.

顺便说一句,遵循curl命令可以工作...
curl -H"Content-Type:application/json"-c cookies.txt -d'{"email":emailVal,"password":passwordVal}'-X POST http ://www.example.com/login.json -i

Joh*_*gle 12

如果是json请求,您可以跳过真实性令牌检查

class ApplicationController < ActionController::Base
  skip_before_filter :verify_authenticity_token, if: :json_request?

  def json_request?
    request.format.json?
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 在 Rails 5+ 上使用 `skip_before_action`。 (2认同)

leo*_*ers 5

将下面的代码添加到您的./app/controllers/application_controller.rb

protect_from_forgery unless: -> { request.format.json? }
Run Code Online (Sandbox Code Playgroud)


Sas*_* B. 1

您可以在表单中传递authenticity_token字段,而不是禁用CSRF检查,例如:

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
Run Code Online (Sandbox Code Playgroud)

http://apidock.com/rails/v2.0.0/ActionController/RequestForgeryProtection/ClassMethods/protect_from_forgery

  • 如果 UI 完全在不同的项目中构建,这可能是不可能的 (3认同)