我正在尝试为rails RESTful API编写一个小的rake任务/测试脚本。我使用the rest-client gem。
根据doumentation,以下内容应该有效( 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代码似乎可以处理它,但我没有运气。我做得很好或者做了一个帖子,但是两个都没有用,我也无法在网上找到这样的例子。有没有人能够让这个工作?我使用的是最新版本的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'
...
值得注意的是,参数并不正确,尽管我虽然遵循了文档中的帖子示例。 (发布和放置都会在日志中给出相同的错误。)
答案 0 :(得分:4)
围绕Alex Coco's blog post讨论如何使用: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
如果您查看该文件,他们建议您这样做。
警告:根据我的理解,这设置了系统策略,这意味着如果你喜欢把头部放在你的REST服务上(在Rail中,它很便宜,而且这是一个简单的方法,特别是如果你想要你的非 - 技术人员能够检查某些东西,但不想和/或不能给他们数据访问权限。我相信这也会为此提供保护。当然,在大多数情况下,防火墙后面的Web访问可能是防火墙,所以它可能没问题。答案 1 :(得分:0)
您可以在控制器中尝试使用skip_before_action :verify_authenticity_token
来获取csrf令牌错误