получение токенов csrf для почтовых запросов json в приложение rails

Я играл с использованием rest-client для доступа к приложению rails, которое я написал. Я написал быстрый скрипт для входа в систему и отправки запроса. Все работает, но мне пришлось обойти тот факт, что аутентификация_токена не обслуживается, если вы делаете запрос на форму в json. Мне пришлось сделать обычный html-запрос, чтобы получить аутентичность_токен, а затем включить его в json, который я отправил как часть моего почтового запроса. В основном у меня есть быстрый грязный скрипт, как показано ниже.

private_resource = RestClient::Resource.new( 'https://mysite.com')

params =  {:user => {:email => '[email protected]', :password => 'please'}}
#log in
login_response = private_resource['users/sign_in'].post(params, :content_type => :json, :accept => :json)
#get cookie
cookie = login_response.cookies
#get json  
json_response = private_resource['products/new'].get(:content_type => :json, :accept => :json, :cookies => cookie)
#another request that returns html form with authenticity token 
response_with_token = private_resource['products/new'].get( :cookies => cookie)
#extract token 
token = Nokogiri::XML(response_with_token).css('input[name=authenticity_token]').first.attr('value')
#update cookie
cookie = response_with_token.cookies
#populate form and insert token
form = JSON.parse(json_response)
form['name'] = "my product"
form['authenticity_token'] = token
#submit the request
private_resource['products'].post(form.to_json, {:cookies => cookie, :content_type => :json, :accept => :json})

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

Я думаю, мне просто любопытно узнать, есть ли причина, по которой аутентификация_токен не обслуживается для запросов json, и мне также интересно, есть ли лучший способ решить проблему с токеном, чем довольно хакерский подход, который я использовал здесь


person Conor    schedule 02.05.2012    source источник


Ответы (2)


Поместите приведенный ниже код в контроллер приложения:

def verified_request?
    if request.content_type == "application/json"
      true
    else
      super()
    end
end

И вызовите этот метод, используя before_filter.

Для получения более подробной информации проверьте: http://blog.technopathllc.com/2011/09/rails-31-csrf-token-authenticity-for.html

И проверьте эту проблему в рельсах: https://github.com/rails/rails/issues/3041

person swati    schedule 02.05.2012
comment
Спасибо за ваш ответ, свати, он выглядит полезным. Я думаю, хотя я пытался избежать простого отключения проверок CSRF. Мне просто кажется немного странным, что рельсы обслуживают формы json, которые не содержат никаких токенов, но затем проверяют токен. Имеет ли смысл просто обслуживать формы json с включенным токеном, а не отключать проверки содержимого json? - person Conor; 08.05.2012
comment
добро пожаловать ... да, это единственный способ обойти проблему с токеном CSRF. Если вы хотите передать токен с вашим запросом JSON, вы можете использовать заголовок, например: headers: { 'X-CSRF-Token': '‹%= form_authenticity_token.to_s %›'} - person swati; 08.05.2012
comment
проверить: stackoverflow.com/questions /7203304/ stackoverflow.com/questions/8503447/ - person swati; 08.05.2012

В app/views/products/new.json.jbuilder добавьте следующее:

json.authenticity_token form_authenticity_token

Это вставит ключ "authenticity_token" со значением, являющимся токеном, поэтому в вашем json_response вы также получите токен. Идея из этого ответа.

person Franklin Yu    schedule 28.08.2016