2

我正在尝试为 Rails RESTful API 编写一个小型 rake 任务/测试脚本。我正在使用rest-client gem

根据文档,以下内容应该可以工作(app.domain明显改变了)

response =  RestClient.post "http://app.domain.com/company/v1", {'company_name' => 'Acme'}.to_json, :content_type => 'application/json', :accept => :json

但是我收到了422 Unprocessable Entity响应。

我之前在使用 Net:HTTP 时得到了相同的响应,并且看到我需要做

request["Content-Type"] = "application/json"

处理 CSRF 问题。在那种情况下工作,但现在我正在尝试使用 RestClient。

上面的 RestClient 代码似乎可以处理它,但我没有任何运气。我做一个 put 或 post 都很好,但都没有工作,我一直无法在网上找到这样的例子。有没有人能让这个工作?我正在使用最新版本的 RestClient 1.6.7


编辑

以下是上述调用的 production.log 文件

I, [2013-10-03T14:35:08.982428 #7677]  INFO -- : Started PUT "/company/v1.json" for XXX.XXX.XXX.XXX at 2013-10-03 14:35:08 +0000
I, [2013-10-03T14:35:08.992628 #7677]  INFO -- : Processing by CompaniesController#add_company as JSON
I, [2013-10-03T14:35:08.992709 #7677]  INFO -- :   Parameters: {"company_name"=>"Acme", "company"=>{"company_name"=>"Acme"}}
W, [2013-10-03T14:35:08.992974 #7677]  WARN -- : Can't verify CSRF token authenticity
I, [2013-10-03T14:35:08.993194 #7677]  INFO -- : Completed 422 Unprocessable Entity in 0ms
F, [2013-10-03T14:35:08.995424 #7677] FATAL -- :
ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
  actionpack (4.0.0) lib/action_controller/metal/request_forgery_protection.rb:163:in `handle_unverified_request'
  actionpack (4.0.0) lib/action_controller/metal/request_forgery_protection.rb:170:in `handle_unverified_request'
  actionpack (4.0.0) lib/action_controller/metal/request_forgery_protection.rb:177:in `verify_authenticity_token'
  activesupport (4.0.0) lib/active_support/callbacks.rb:377:in `_run__389768266939471454__process_action__callbacks'
  activesupport (4.0.0) lib/active_support/callbacks.rb:80:in `run_callbacks'
  actionpack (4.0.0) lib/abstract_controller/callbacks.rb:17:in `process_action'
  actionpack (4.0.0) lib/action_controller/metal/rescue.rb:29:in `process_action'
  actionpack (4.0.0) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action'
  activesupport (4.0.0) lib/active_support/notifications.rb:159:in `block in instrument'
  ...

有趣的是,尽管我遵循文档中的帖子示例,但参数不正确。(发布和放置都在日志中给我同样的错误。)

4

2 回答 2

4

作为一项围绕Alex Coco 的博客文章的工作,专门讨论了使用 :null_session

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  #protect_from_forgery with: :exception                   # default code
  protect_from_forgery with: :null_session                 # modification
end

如果您查看文件,他们建议您这样做。

警告:据我了解,这设置了系统策略,这意味着如果您喜欢在您的 RESTful 服务上投入精力(在 Rail 中,获得头脑很便宜,而且这是一种简单的方法,特别是如果您需要非技术人员能够检查某些东西但不想和/或不能给他们数据访问权限)我相信这也会关闭保护。当然,在大多数情况下,对服务头部的 Web 访问可能在防火墙后面,所以它可能没问题。

于 2013-10-03T19:57:16.880 回答
0

您可以尝试skip_before_action :verify_authenticity_token在您的控制器中收到 csrf 令牌错误

于 2014-09-25T09:46:20.410 回答