Rails захлебнулся содержимым этого запроса из-за protect_from_forgery - PullRequest
4 голосов
/ 18 апреля 2010

Я пытаюсь просто протестировать мой RESTful API с помощью cURL. Используя следующий вызов:

curl -d "name=jimmy" -H "Content-Type: application/x-www-form-urlencoded" http://127.0.0.1:3000/people.xml -i

Рельсы умирают, хотя:

ActionController :: InvalidAuthenticityToken (ActionController :: InvalidAuthenticityToken): : 8: в `синхронизировать '

Похоже, это выполняется через фильтр protect_from_forgery. Я думал, что protect_from_forgery исключен для HTTP-запросов типа POST / PUT / DELETE, отличных от HTML? Это явно нацелено на формат XML.

Если я передаю фактический XML-контент, он работает. Но мои пользователи будут отправлять POST-данные в виде параметров в кодировке URL. Я знаю все способы, которыми я могу отключить protect_from_forgery, но как правильно это сделать? Я хочу оставить его включенным, чтобы, когда у меня были формы на основе HTML и я обрабатывал format.html, я не забывал повторно включить его на тот момент. Я хочу, чтобы пользователи могли отправлять HTTP-запросы POST к моему API на основе XML, но не засыпать этим.

1 Ответ

2 голосов
/ 21 апреля 2010

Как насчет того, чтобы идти по этому пути?

В вашем контроллере:

  skip_before_filter :verify_authenticity_token, :only => :api

      def api
        @callback = request.body.read
        if !@callback.blank?
          People.create :name => @callback
       end
      end

В маршрутах .rb:

  map.api '/api', :controller => "people", :action => "api"

Тогда скручиваемость:

curl -d "jimmy" http://localhost:3000/api -i

Вот что я получаю:

HTTP/1.1 200 OK
Connection: close
Date: Wed, 21 Apr 2010 16:31:52 GMT
ETag: "1bafa7f069ba62f46577e0172a29b7cc"
Content-Type: text/html; charset=utf-8
X-Runtime: 141
Content-Length: 476
Set-Cookie: _tsearchtest_session=BAh7BjoPc2Vzc2lvbl9pZCIlNjJlOTViOGZhODc1NmU5NDg1MWUyYWQ3YWQ0NzFiYjU%3D--651c3bfcbb0f180c72653379678d410711ead2eb; path=/; HttpOnly
Cache-Control: private, max-age=0, must-revalidate

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
  <title>People: api</title>
  <link href="/stylesheets/scaffold.css?1271863770" media="screen" rel="stylesheet" type="text/css" />
</head>
<body>

<p style="color: green"></p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...