如何在rails中处理来自应用程序控制器的无效真实性令牌json请求

Posted

技术标签:

【中文标题】如何在rails中处理来自应用程序控制器的无效真实性令牌json请求【英文标题】:How to handle Invalid Authenticity Token json request from application controller in rails 【发布时间】:2019-04-19 14:46:08 【问题描述】:

当用户尝试使用脚本或自动化填写表单时,应用程序控制器会引发错误

“ActionController::InvalidAuthenticityToken”

当真正的有效用户填写表单、关闭浏览器、从浏览器历史记录中重新打开页面并提交表单时,就会发生这种情况。

在这种情况下,我不想使用异常通知器发送异常,并且我还想显示带有刷新的请求消息的模式。

所以我把 application_controller 修改为

class ApplicationController < ActionController::Base

  protect_from_forgery with: :exception

  rescue_from ActionController::InvalidAuthenticityToken, with: :handle_csrf_error

  def handle_csrf_error(exception)
    respond_to do |format|
      format.js 
        render 'invalid_requests/error'
      
      format.html 
        render text: I18n.t('errors.messages.csrf_error')
      
    end
    ExceptionNotifier.notify_exception(exception)
  end

end

我想让它适用于所有类型的请求。

我已经为 html & js 请求添加了响应

但不知道如何处理 json 请求。

P.S > json 请求是从 web 应用程序发送的,用于加载更多案例,有时会引发异常,所以希望我来处理。

我的 Rails 版本是 4.2

【问题讨论】:

请注意,CSRF 保护仅适用于 Rails 为视图提供服务的“经典应用程序”(因为客户端需要从表单中获取令牌)并且客户端接受 cookie。对于提供 JSON 的 API,您需要禁用 Rails CSRF 保护。 ***.com/questions/35181340/… 【参考方案1】:

在您的控制器中关闭对真实性令牌的检查。

skip_before_action :verify_authenticity_token

见http://***.com/questions/1177863/ddg#1177883

【讨论】:

【参考方案2】:

在确保您的 请求 正确地发出 json 请求而不是 js 之后(检查您的 Content-Type 标头)。将format.json 添加到您的服务器响应

respond_to do |format|
  format.json  render json: true 
end

【讨论】:

以上是关于如何在rails中处理来自应用程序控制器的无效真实性令牌json请求的主要内容,如果未能解决你的问题,请参考以下文章

我的 jquery AJAX POST 请求无需发送真实性令牌(Rails)即可工作

Ruby on Rails - 来自 Paypal 的参数:utf-8 中的无效字节序列

Rails 3 AJAX请求真实性令牌被忽略

如何在 JQuery/Javascript 中处理来自服务器(源)的无效 JSON

Rails:如何在会话中存储数据?

Rails 4 真实性令牌