Как отключить фильтр rails protect_from_forgery только для json - PullRequest
5 голосов
/ 19 апреля 2011

У меня есть веб-сайт, созданный с помощью 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 -i

Ответы [ 4 ]

11 голосов
/ 28 марта 2014

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

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

  def json_request?
    request.format.json?
  end
end
3 голосов
/ 20 апреля 2011

Посмотрите на этот пост: http://zadasnotes.blogspot.com/2010/11/rails-3-forgery-csrf-protection-for.html

Обновление

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

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

1 голос
/ 24 марта 2014

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

<%= hidden_field_tag :authenticity_token, form_authenticity_token %>

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

0 голосов
/ 19 июля 2018

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

protect_from_forgery unless: -> { request.format.json? }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...