2016-02-03 6 views
29

Я хочу сделать POST request моему местному разработчика, например:Rails: не удается проверить подлинность CSRF токен при выполнении запроса POST

HTTParty.post('http://localhost:3000/fetch_heroku', 
       :body => {:type => 'product'},) 

Однако, с консоли сервера он сообщает

Started POST "/fetch_heroku" for 127.0.0.1 at 2016-02-03 23:33:39 +0800 
    ActiveRecord::SchemaMigration Load (0.0ms) SELECT "schema_migrations".* FROM "schema_migrations" 
Processing by AdminController#fetch_heroku as */* 
    Parameters: {"type"=>"product"} 
Can't verify CSRF token authenticity 
Completed 422 Unprocessable Entity in 1ms 

Вот мой контроллер и настраивает маршруты, это довольно просто.

def fetch_heroku 
    if params[:type] == 'product' 
     flash[:alert] = 'Fetch Product From Heroku' 
     Heroku.get_product 
    end 
    end 

    post 'fetch_heroku' => 'admin#fetch_heroku' 

Я не уверен, что мне нужно делать? Отключение CSRF, безусловно, будет работать, но я думаю, что это должна быть моя ошибка при создании такого API.

Есть ли какие-либо другие настройки, которые мне нужно сделать?

+3

Для API обычно принято отключать проверку валидации _CSRF_.Я использую 'protect_from_forgery с:: null_session'. – dcestari

ответ

39

Подделка ссылок на другие сайты - это когда вредоносная веб-страница вводит в заблуждение пользователей, выполняющих запрос, который не предназначен, например, с помощью букмарклетов, iframe или просто путем создания страницы, которая на вид достаточно похожа, чтобы обмануть пользователей.

Rails CSRF protection выполнен для «классических» веб-приложений - он просто дает уверенность в том, что запрос возник из собственного веб-приложения. Маркер CSRF работает как секрет, который знает только ваш сервер. Rails генерирует случайный токен и сохраняет его в сеансе. Ваши формы отправляют токен через скрытый ввод, а Rails проверяет, что любой запрос не GET включает в себя токен, который соответствует тому, что хранится в сеансе.

Однако API обычно по определению является кросс-сайтом и предназначен для использования в более чем вашем веб-приложении, что означает, что вся концепция CSRF не совсем применима.

Вместо этого вы должны использовать основанную на токенах стратегию аутентификации запросов API с ключом и секретом API, поскольку вы проверяете, что запрос поступает от одобренного клиента API, а не из вашего собственного приложения.

Вы можете отключить CSRF как отметил @dcestari:

class ApiController < ActionController::Base 
    protect_from_forgery with: :null_session 
end 

Обновлено. В Rails 5 Вы можете создать API только приложения с помощью опции --api:

rails new appname --api 

Они не включают CSRF промежуточное программное обеспечение и многие другие компоненты, которые superflouus.

+0

Спасибо, я хочу отключить часть CSRF: http://stackoverflow.com/questions/5669322/turn-off-csrf-token-in-rails-3 – cqcn1991

22

Другой способ отключить CSRF, что не будет оказывать нулевой сеанс, чтобы добавить:

skip_before_action :verify_authenticity_token в вашем Rails контроллера. Это обеспечит вам доступ к информации о сеансе.

Опять же, убедитесь, что вы выполняете это только в контроллерах API или в других местах, где защита CSRF не совсем применима.

Смежные вопросы