У меня есть приложение rails с URL-адресом POST, которое создает некоторые ресурсы. У меня есть страница с формой, которая принимает всю информацию и выполняет AJAX-вызов URL-адреса POST без токена аутентичности.
Я делаю data["authenticity_token"] = ""; перед вызовом AJAX.
Параметры, зарегистрированные на стороне сервера, приведены ниже.
{"utf8"=>"✓", "authenticity_token"=>"", "company_customer"=>{"name"=>"Anand"}}
Ресурсы создаются без ошибок (у меня protect_from_forgery with: :exception в моем ApplicationController).
Но когда я попытался вызвать тот же URL-адрес POST из Postman, я получил ошибку InvalidAuthenticityToken.





На первом этапе, то есть из браузера, у вас может быть какой-то идентификатор сеанса в файлах cookie, но здесь его нет.
Кроме того, если вы выбрали опцию remote:true, он возьмет токен подлинности со страницы в скрытом поле.
Для получения дополнительной информации проверьте свои журналы в обоих случаях.
Этот токен автоматически добавляется в скрытое поле, когда вы используете вспомогательный метод form_for для генерации форм, поэтому Rails гарантирует, что запрос поступает из одной из ваших форм.
Вы должны снять защиту с действия вашего контроллера по запросу от почтальона или любого другого приложения, как это сделать: https://stackoverflow.com/a/22715175/8352929
Fyi, упомянутое решение представляет уязвимость csrf.
Вы можете узнать, как работает CSRF, из здесь. Я рекомендую вам пройти через это.
Каждый раз, когда вы используете form_for, Rails добавляет в вашу форму одно скрытое поле ввода, которое выглядит следующим образом:
<input type = "hidden" name = "authenticity_token" value = "doLYVxrkhdrzn7zzriHXjFE6ZhNCuXVxLrau4ouENmuKKC/SWp2NMM/MeL/Ji2tDvzNcJHVN/Hc0LIluL3o5QQ= = " />
Кроме того, Rails включает токен CSRF в метатеги веб-сайта, который выглядит следующим образом:
<meta name = "csrf-token" content = "zxnmBxg81JUQPG/C/wb3HRCah0m9Xe2A+gZ5N0Oy7cfwC+dF4hC325WxdVDLfkIxcw/CR/xyaC1phpvZ4EcgQw= = " />
Итак, когда вы используете Rails form_for или что-то подобное для вызова AJAX (может быть с remote: true), токен аутентификации отправляется на сервер. Которого не было, когда вы пытались отправить тот же запрос с помощью Postman.
Если вы скопируете токен CSRF и добавите его в параметры Postman, запрос будет успешно выполнен.
Я прокомментировал один из ответов выше, но я вставлю его сюда еще раз. Я не занимаюсь remote: true. Я сериализую поля ввода и отправляю их с помощью вызова jQuery ajax. При отправке запроса tge я делаю authenticity_token равным нулю (для тестирования). Тем не менее, запрос обрабатывается без ошибок. Но когда я отправляю запрос от почтальона без Authentity_token, я получаю сообщение об ошибке.
Можете ли вы подтвердить то же самое, проверив params в журналах сервера? А также, пожалуйста, обновите свой вопрос информацией
jquery-ujs автоматически добавляет токен CSRF при использовании POST с jquery. Ссылка: stackoverflow.com/questions/35162218/…Я вручную делаю authenticity_token равным нулю, прежде чем делать запрос AJAX. Я проверил журнал сервера, токен не заполнен. Вот почему я запутался. Как получилось, что запрос аутентифицируется без authenticity_token? В этом случае он должен был работать и с почтальоном.
Можете ли вы сбросить журналы сервера и код jQuery, ответственный за вызов AJAX в вопросе?
Я не занимаюсь
remote: true. Я сериализую поля ввода и отправляю их с помощью вызова jQuery ajax. При отправке запроса tge я делаюauthenticity_tokenравным нулю (для тестирования). Тем не менее, запрос обрабатывается без ошибок. Но когда я отправляю запрос от почтальона без Authentity_token, я получаю сообщение об ошибке.