Ошибка InvalidAuthenticityToken в маршруте сообщения рельсов

У меня есть приложение 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.

  1. Почему я получаю сообщение об ошибке?
  2. Как приложение rails проверяет подлинность запроса POST в первом случае?
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
772
3

Ответы 3

На первом этапе, то есть из браузера, у вас может быть какой-то идентификатор сеанса в файлах cookie, но здесь его нет.

Кроме того, если вы выбрали опцию remote:true, он возьмет токен подлинности со страницы в скрытом поле.

Для получения дополнительной информации проверьте свои журналы в обоих случаях.

Я не занимаюсь remote: true. Я сериализую поля ввода и отправляю их с помощью вызова jQuery ajax. При отправке запроса tge я делаю authenticity_token равным нулю (для тестирования). Тем не менее, запрос обрабатывается без ошибок. Но когда я отправляю запрос от почтальона без Authentity_token, я получаю сообщение об ошибке.

Anand Hegde 01.06.2018 16:29

Этот токен автоматически добавляется в скрытое поле, когда вы используете вспомогательный метод form_for для генерации форм, поэтому Rails гарантирует, что запрос поступает из одной из ваших форм.

Вы должны снять защиту с действия вашего контроллера по запросу от почтальона или любого другого приложения, как это сделать: https://stackoverflow.com/a/22715175/8352929

Fyi, упомянутое решение представляет уязвимость csrf.

Gabor Lengyel 01.06.2018 14:13

Вы можете узнать, как работает 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, я получаю сообщение об ошибке.

Anand Hegde 01.06.2018 16:35

Можете ли вы подтвердить то же самое, проверив params в журналах сервера? А также, пожалуйста, обновите свой вопрос информацией

Kartikey Tanna 01.06.2018 16:38
jquery-ujs автоматически добавляет токен CSRF при использовании POST с jquery. Ссылка: stackoverflow.com/questions/35162218/…
Kartikey Tanna 01.06.2018 16:42

Я вручную делаю authenticity_token равным нулю, прежде чем делать запрос AJAX. Я проверил журнал сервера, токен не заполнен. Вот почему я запутался. Как получилось, что запрос аутентифицируется без authenticity_token? В этом случае он должен был работать и с почтальоном.

Anand Hegde 01.06.2018 17:36

Можете ли вы сбросить журналы сервера и код jQuery, ответственный за вызов AJAX в вопросе?

Kartikey Tanna 01.06.2018 19:45

Другие вопросы по теме