Если эта protect_from_forgery
опция упоминается в application_controller, я могу войти в систему и выполнить любые запросы GET, но при самом первом запросе POST Rails сбрасывает сеанс, в результате чего я выхожу из системы.
Я protect_from_forgery
временно отключил эту опцию, но хотел бы использовать ее с Angular.js. Есть ли способ сделать это?
Ответы:
Я думаю, что чтение CSRF-значения из DOM - не лучшее решение, это просто обходной путь.
Вот форма документа официального сайта angularJS http://docs.angularjs.org/api/ng.$http :
Вот мое решение, основанное на этих инструкциях:
Сначала установите cookie:
Затем мы должны проверять токен для каждого запроса, отличного от GET.
Поскольку в Rails уже есть аналогичный метод, мы можем просто переопределить его, чтобы добавить нашу логику:
источник
Если вы используете защиту Rails CSRF по умолчанию (
<%= csrf_meta_tags %>
), вы можете настроить свой модуль Angular следующим образом:Или, если вы не используете CoffeeScript (что !?):
Если вы предпочитаете, вы можете отправлять заголовок только для запросов, отличных от GET, примерно так:
Кроме того, обязательно ознакомьтесь с ответом HungYuHei , который охватывает все базы на сервере, а не на клиенте.
источник
<%= csrf_meta_tags %>
. Я подумал, что этого достаточно, чтобы упомянутьprotect_from_forgery
. Что делать? Базовый документ должен быть простым HTML (я здесь не тот, кто выбирает).protect_from_forgery
то, что вы говорите, это «когда мой код JavaScript делает запросы Ajax, я обещаю отправитьX-CSRF-Token
в заголовке, который соответствует текущему токену CSRF». Чтобы получить этот токен, Rails внедряет его в DOM с<%= csrf_meta_token %>
помощью jQuery и получает содержимое метатега с помощью jQuery всякий раз, когда он делает запросы Ajax (драйвер Rails 3 UJS по умолчанию делает это за вас). Если вы не используете ERB, нет способа получить текущий токен из Rails на странице и / или в JavaScript - и, следовательно, вы не можете использовать егоprotect_from_forgery
таким образом.csrf_meta_tags
каждый раз, когда сервер генерирует ответ, и каждый раз эти теги отличаются от предыдущих. Итак, эти теги уникальны для каждого запроса. Возникает вопрос: как приложение получает эти теги для запроса AJAX (без angular)? Я использовал protect_from_forgery с запросами jQuery POST, никогда не удосужился получить этот токен CSRF, и это сработало. Как?jQuery.ajaxPrefilter
как показано здесь: github.com/indirect/jquery-rails/blob/c1eb6ae/vendor/assets/ ... Вы можете просмотреть этот файл и увидеть все обручи, через которые проходит Rails, чтобы заставить его работать в значительной степени без необходимости беспокоиться об этом.put
иpost
вместо этогоcommon
? Из руководства по безопасности рельсов :The solution to this is including a security token in non-GET requests
Angular_rails_csrf камень автоматически добавляет поддержку для шаблона , описанного в ответ HungYuHei по всем контроллерам:
источник
angular_rails_csrf
гем не работает с Rails 5. Однако настройка заголовков запросов Angular со значением из метатега CSRF работает!Ответ, который объединяет все предыдущие ответы и полагается, что вы используете
Devise
драгоценный камень аутентификации.Прежде всего, добавьте драгоценный камень:
Затем добавьте
rescue_from
блок в application_controller.rb:И, наконец, добавьте модуль перехватчика в свое приложение angular.
источник
$injector
а не просто делаете это напрямую$http
?Я видел другие ответы и думал, что они отличные и хорошо продуманные. Я заставил мое приложение rails работать с тем, что я считал более простым решением, поэтому я решил поделиться. В моем приложении rails это было по умолчанию,
Я прочитал комментарии, и мне показалось, что это то, что я хочу использовать angular и избежать ошибки csrf. Я изменил это на это,
И теперь это работает! Я не вижу причин, по которым это не должно работать, но я хотел бы услышать некоторые идеи от других плакатов.
источник
Я использовал контент из ответа HungYuHei в своем приложении. Однако я обнаружил, что имел дело с несколькими дополнительными проблемами, некоторые из-за того, что я использовал Devise для аутентификации, а некоторые из-за значения по умолчанию, которое я получил с моим приложением:
Я отмечаю связанный вопрос о переполнении стека и ответы на него , и я написал гораздо более подробное сообщение в блоге, в котором суммируются различные соображения. Части этого решения, которые здесь актуальны, находятся в контроллере приложения:
источник
Я нашел очень быстрый способ взлома. Все, что мне нужно было сделать, это следующее:
а. На мой взгляд, я инициализирую
$scope
переменную, которая содержит токен, скажем, перед формой, или даже лучше при инициализации контроллера:б. В моем контроллере AngularJS перед сохранением новой записи я добавляю токен в хэш:
Больше ничего делать не нужно.
источник
Он работает на стороне angularjs!
источник