Я работал над новым приложением Rails 4 (на Ruby 2.0.0-p0), когда столкнулся с некоторыми проблемами с токенами подлинности.
При написании контроллера, который отвечает на json (используя respond_to
метод класса), я получил create
действие, которое я начал получать ActionController::InvalidAuthenticityToken
исключения, когда пытался создать запись с использованием curl
.
Я удостоверился, что установил, -H "Content-Type: application/json"
и я установил данные с, -d "<my data here>"
но все еще не удача.
Я попытался написать тот же контроллер с использованием Rails 3.2 (на Ruby 1.9.3), и у меня не возникло проблем с токеном подлинности. Я искал вокруг и увидел, что в Rails 4 произошли некоторые изменения с токенами аутентичности. Насколько я понимаю, они больше не вставляются автоматически в формы? Я предполагаю, что это как-то влияет на не-HTML типы контента.
Есть ли способ обойти это без необходимости запрашивать HTML-форму, перехватывая токен аутентификации, а затем отправляя другой запрос с этим токеном? Или я полностью упускаю что-то совершенно очевидное?
Изменить: Я только что попытался создать новую запись в новом приложении Rails 4, используя скаффолд, не меняя ничего, и я столкнулся с той же проблемой, поэтому я думаю, что это не то, что я сделал.
before_action
который проверяет формат и проверяется ли запрос. Я не знаю ни одного встроенного способа установить условия.skip_before_action :verify_authenticity_token
на контроллере приложения моего API, чтобы эта работа работала.:verify_authenticy_token
в Rails 4.2. По умолчанию используется значение:null_session
, которое, как следует из названия, просто дает вам запрос без сеанса. Вместо этого вы можете проверить запрос через ключ API.Вместо того, чтобы выключать защиту csrf, лучше добавить следующую строку кода в форму
и если вы используете form_for или form_tag для генерации формы, то она автоматически добавит вышеуказанную строку кода в форму
источник
Добавление следующей строки в форму работало для меня:
источник
=token_tag nil
или (в .erb)<%= token_tag nil %>
Я не думаю, что хорошо вообще отключать защиту CSRF, если вы не используете исключительно API.
Просматривая документацию по Rails 4 API для ActionController, я обнаружил, что вы можете отключить защиту от подделки для каждого контроллера или для каждого метода.
Например, чтобы отключить защиту CSRF для методов, которые вы можете использовать
источник
Наткнулся на ту же проблему. Исправлено, добавив в мой контроллер:
источник
Ты пробовал?
источник
В этом официальном документе рассказывается о том, как правильно отключить защиту от мошенничества для API http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html.
источник
Это функция безопасности в Rails. Добавьте эту строку кода в форму:
Документацию можно найти здесь: http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection.html
источник
Эти функции были добавлены в целях безопасности и защиты от подделки.
Однако, чтобы ответить на ваш вопрос, вот некоторые материалы. Вы можете добавить эти строки после вашего имени контроллера.
Вот так,
Вот несколько строк для разных версий рельсов.
Рельсы 3
Рельсы 4 :
Если вы намереваетесь отключить эту функцию безопасности для всех подпрограмм контроллера, вы можете изменить значение protect_from_forgery на : null_session в вашем файле application_controller.rb.
Вот так,
источник
Если вы используете jQuery с rails, будьте осторожны, разрешив вход в методы без проверки токена подлинности.
JQuery-UJS может управлять токенами для вас
Он должен быть уже в составе гема jquery-rails, но вам может понадобиться включить его в application.js с
Это все, что вам нужно - теперь ваш Ajax-вызов должен работать
Для получения дополнительной информации см .: https://github.com/rails/jquery-ujs.
источник
Добавить
authenticity_token: true
в форму тегисточник
Когда вы определяете свою собственную HTML-форму, вы должны включить строку токена аутентификации, которую следует отправить контроллеру из соображений безопасности. Если вы используете rails form helper для генерации токена подлинности, он добавляется в форму следующим образом.
Таким образом, решение проблемы состоит в том, чтобы либо добавить поле authenticity_token, либо использовать помощники формы rails, чем поставить под угрозу безопасность и т. Д.
источник
application/json
.Все мои тесты работали нормально. Но по какой-то причине я установил переменную окружения как non-test:
Я забыл сбросить эту переменную, из-за которой я начал получать
ActionController::InvalidAuthenticityToken
исключения.После сброса
$RAILS_ENV
мои тесты снова начали работать.источник