Пытаюсь сделать пост или поставить с помощью RestClient; получаю ошибку 422

Я пытаюсь написать небольшую задачу/тестовый скрипт rake для RESTful API рельсов. Я использую гем rest-client.

В соответствии с документацией должно работать следующее (с < em>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'
  ...

Также интересно отметить, что параметры неверны, хотя я следовал примеру поста из документации. (Post и put оба дают мне одинаковые ошибки в журнале.)


person hershey    schedule 02.10.2013    source источник
comment
У вас есть доступ к журналу API? Можно ли получить лог из API по этому запросу?   -  person usha    schedule 03.10.2013
comment
Хороший вопрос, я только что добавил его в пост выше.   -  person hershey    schedule 03.10.2013
comment
Служба ожидает маркер аутентификации. ActionController::InvalidAuthenticityToken. Но он должен возвращать 401 Unauthorized вместо необрабатываемого объекта.   -  person usha    schedule 03.10.2013


Ответы (2)


В качестве обходного пути в в блоге Алекса Коко говорится конкретно об использовании :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 дешево получить голову, и это простой способ поковыряться, особенно если вы хотите, чтобы ваш нетехнический персонал чтобы иметь возможность что-то проверить, но не хотят и / или не могут предоставить им доступ к данным) Я считаю, что это также отключает защиту для этого. Конечно, веб-доступ к голове для службы, скорее всего, в большинстве случаев находится за брандмауэром, так что, вероятно, это нормально.

person hershey    schedule 03.10.2013

Вы можете попробовать skip_before_action :verify_authenticity_token в своем контроллере, где вы получаете ошибку токена csrf

person Ravindra    schedule 25.09.2014