RoR UI & WebService: работа вокруг protect_from_forgery - PullRequest
2 голосов
/ 04 января 2012

Я хотел бы использовать мое приложение RoR для обработки запросов как к пользовательскому интерфейсу, так и к API ReSTful, однако у меня возникают проблемы из-за флага protect_from_forgery.Я не хочу, чтобы пользователь API сохранял cookie-файл или передавал authenticity_token;и я хочу иметь возможность использовать одни и те же запросы ReSTful как для пользовательского интерфейса, так и для API.Например,

https://host.domain.com/user/show/1
https://host.domain.com/user/create

Контроллеру приложений потребуется проверить, выполняется ли вызов API, а затем не вызывать флаг protect_from_forgery.Так что-то вроде:

skip_before_filter :verify_authenticity_token, :only => :api

Но здесь :api - это действие, и мне нужно будет нанести на карту новый маршрут.Я не думаю, что это позволило бы мне использовать те же контроллеры и действия, что и в пользовательском интерфейсе.

Так что я не совсем понимаю, как решить эту проблему.Конечно, это общая проблема, которую пришлось решить многим другим.Я ценю любую помощь, которую могут оказать люди.

1 Ответ

0 голосов
/ 04 января 2012

Вот такая дурацкая идея: пропустите фильтр before для всех действий.Затем добавьте новый фильтр

def verify_authenticity_token_or_api
  api? || verify_authenticity_token
end

. В вашем методе api определите, является ли запрос запросом API.Будьте осторожны, чтобы не позволить людям обходить защиту от подделки, делая запросы, которые немного похожи на запросы API - вы можете захотеть сделать что-то вроде аннулирования сессии пользователя, если есть что-то, похожее на запрос API.Подход заключается в том, чтобы просто иметь выделенные конечные точки и контроллеры для вашего API.В то время как материал, который вы получаете бесплатно, привлекателен, иногда ресурсы, которые вы хотите показать, не соответствуют вашим моделям

...