Как отключить фильтр 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.
Вы можете просто пропустить проверку токена подлинности, если это запрос 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 %>