与 Rails 中的许多功能一样,禁用基本控制器中的某些功能会在所有派生控制器中禁用它。要完全关闭 CSRF,请在 ApplicationController 中禁用它:
skip_forgery_protection
This is 的别名 https://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html:
skip_before_action :verify_authenticity_token
The skip_before_action http://api.rubyonrails.org/classes/AbstractController/Callbacks/ClassMethods.html#method-i-skip_before_action方法确实具有自定义其应用方式的选项,因此您可以缩小对此的关注范围:
skip_before_action :verify_authenticity_token, unless: csrf_required?
正如您所展示的,您可以定义一种方法来限制它。如果该方法返回true
该操作会照常执行,否则会被跳过。
编写 API 时,通常使用 API::BaseController 作为中间控制器,这样您就可以将基于会话的活动与基于 API 的活动分开。例如:
class API::BaseController < ApplicationController
skip_before_action :verify_authenticity_token
end
然后从该控制器派生所有特定于 API 的控制器。即使在主要由 API 驱动的应用程序中,您也可能需要一个带有表单提交的传统“注册”页面,或者一个能够编辑和更新内容的管理区域。
我发现的一种选择是在提供 API 密钥的情况下禁用 CSRF 保护。例如:
def csrf_required?
params[:api_key].blank?
end
这意味着您仍然可以接受传统的“表单编码”或 XML API 调用。如果您的 API 密钥是通过标头提供的(如某些要求所示),您可以对其进行调整以进行测试request
因此。