API/JSON:无法验证 CSRF 令牌的真实性

Posted

技术标签:

【中文标题】API/JSON:无法验证 CSRF 令牌的真实性【英文标题】:API/JSON: Can't verify CSRF token authenticity 【发布时间】:2016-04-23 10:27:32 【问题描述】:

我正在尝试为我的 Rails 应用程序构建 JSON API,并编写了以下方法:

  def create
    organization = Organization.find(params[:organization][:node_id])
    node = organization.nodes.build(nodes_params.except[:id])
    if node.save
      render json: node, status: :ok
    else
      render json: node, status: :bad_request
    end
  end

在 Postman 中尝试该方法返回错误:“无法验证 CSRF 令牌真实性”。基于this post,我将以下代码添加到基本控制器中。不幸的是,这没有任何区别。有人了解错误原因吗?

protect_from_forgery
skip_before_action :verify_authenticity_token, if: :json_request?
private
  def json_request?
    request.format.json?
  end

【问题讨论】:

***.com/questions/9362910/…的可能重复 你使用哪个 Rails 环境来测试你的控制器的方法? 我正在使用开发环境(使用 Cloud9 IDE)。现在正试图弄清楚@MaxWilliams 建议的帖子。 如果您只想使用 json 请求测试组织创建,请尝试在测试环境中启动 rails。 谢谢,我可以使用 protect_from_forgery with: :null_session, :if => Proc.new |c| c.request.format == 'application/json' 【参考方案1】:

根据application_controller.rb 的评论,您需要输入此行 protect_from_forgery with: :null_session.

如果你只为从ApplicationController 继承的所有 API 控制器再创建一个根控制器会更好。即

class Api::ApiController < ApplicationController
  #TODO
  protect_from_forgery with: :null_session
end

其他 API 的控制器

class Api::V1::AddressesController < Api::ApiController
  #TODO
end

此控制器类可以帮助您仅对 API 的根而不是整个应用程序进行更改。您还可以使用此控制器在不同版本的 API 之间进行 D.R.Y 操作。

【讨论】:

以上是关于API/JSON:无法验证 CSRF 令牌的真实性的主要内容,如果未能解决你的问题,请参考以下文章

角度注销后无法验证 CSRF 令牌的真实性

无法验证 CSRF 令牌真实性 Rails 4.1

警告:无法验证 CSRF 令牌的真实性

Rails post 无法验证 CSRF 令牌的真实性

无法在 Rails 中验证 CSRF 令牌的真实性

Rails 3:无法验证 CSRF 令牌的真实性