Я хочу передать POST request
своему местному разработчику вот так:
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.
Есть ли какие-то другие настройки, которые мне нужно сделать?
ruby-on-rails
cqcn1991
источник
источник
protect_from_forgery with: :null_session
.Ответы:
Подделка межсайтовых запросов (CSRF / XSRF) - это когда вредоносная веб-страница обманом заставляет пользователей выполнить запрос, который не предназначен, например, с помощью букмарклетов, фреймов или просто путем создания страницы, которая визуально достаточно похожа, чтобы обмануть пользователей.
Защита Rails CSRF сделано для «классических» веб - приложений - это просто дает степень уверенности в том , что запрос возник из вашего собственного веб - приложения. Токен 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 и многие другие компоненты, которые являются суперпроизводителями.
источник
Другой способ отключить CSRF, который не будет отображать нулевой сеанс, - это добавить:
skip_before_action :verify_authenticity_token
в вашем контроллере Rails. Это гарантирует, что у вас по-прежнему будет доступ к информации о сеансе.
Опять же, убедитесь, что вы делаете это только в контроллерах API или в других местах, где защита CSRF не совсем применима.
источник
protect_from_forgery except: [:my_method_name]
?Соответствующая информация о конфигурации CSRF применительно к контроллерам API есть на api.rubyonrails.org :
источник
protect_from_forgery
это все еще необходимо для API, и источниками, которые говорят, что это не так. Что, если API предназначен для одностраничного приложения, которое использует файл cookie сеанса для аутентификации пользователя?Начиная с Rails 5, вы также можете создать новый класс с :: API вместо :: Base:
class ApiController < ActionController::API end
источник
Если вы хотите исключить действие sample контроллера
class TestController < ApplicationController protect_from_forgery :except => [:sample] def sample render json: @hogehoge end end
Вы можете без проблем обрабатывать запросы извне.
источник
Самым простым решением проблемы является выполнение стандартных действий в вашем контроллере или вы можете напрямую поместить его в ApplicationController.
class ApplicationController < ActionController::Base protect_from_forgery with: :exception, prepend: true end
источник