Как отключить фильтр rails protect_from_forgery только для json

У меня есть веб-сайт, созданный с помощью Rails3, и теперь я хочу реализовать json API для доступа мобильных клиентов. Однако отправка json-запроса от клиента из-за фильтра protect_from_forgery. Поскольку клиент не будет извлекать какие-либо данные с сервера, клиент не сможет получить auth_token, поэтому я хотел бы отключить опцию protect_from_forgery только для запросов json (я думал, что rails3 делает это по умолчанию, но, очевидно, это не так),

Я знаю, что подобная тема обсуждается здесь, но в этом случае он получает auth_token перед отправкой почтового запроса.

Так что мой вопрос - отключить protect_from_forgery только для json, это хороший способ сделать это? Если да, то как это сделать? Если нет, какова альтернатива?

К вашему сведению, я использую следующий запрос ajax

$.ajax({
             type: 'POST',  
             url: "http://www.example.com/login.json",  
             data: { 'email': emailVal, 'password': passwordVal },  
             success: onSuccess,  
             error: onError,  
             dataType: "json"  
});

и я получаю ActionController::InvalidAuthenticityToken ошибку.

Кстати, следующая команда curl работает, хотя...
curl -H "Тип контента: application/json" -c cookies.txt -d '{"электронная почта": emailVal, "пароль": passwordVal}' -X POST http://www.example.com/login.json

4 ответа

Решение

Взгляните на этот пост: http://zadasnotes.blogspot.com/2010/11/rails-3-forgery-csrf-protection-for.html

Обновить

С тех пор статья была удалена, поэтому я быстро выполнил поиск и обнаружил, что первоначальный автор статьи разместил этот вопрос на SO.

Маркер аутентификации AJAX-запроса Rails 3 игнорируется

Вы можете просто пропустить проверку токена подлинности, если это запрос json

class ApplicationController < ActionController::Base
  skip_before_filter :verify_authenticity_token, if: :json_request?

  def json_request?
    request.format.json?
  end
end

Добавьте код ниже к вашему ./app/controllers/application_controller.rb:

protect_from_forgery unless: -> { request.format.json? }

Вместо отключения проверки CSRF вы можете передать поле authenticity_token в ваших формах, например:

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>

http://apidock.com/rails/v2.0.0/ActionController/RequestForgeryProtection/ClassMethods/protect_from_forgery

Другие вопросы по тегам