Ошибка InvalidAuthenticityToken в рельсе после маршрута - PullRequest
0 голосов
/ 01 июня 2018

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

  1. Почему я получаю ошибку?
  2. Как приложение rails проверяет подлинность запроса POST в первом случае?

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

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

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

0 голосов
/ 01 июня 2018

Вы можете узнать, как работает 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), токен аутентификации отправляетсяна сервер.Которого не было, когда вы пытались отправить тот же запрос с почтальоном.

Если вы скопируете токен CSRF и добавите его в параметры почтальона, запрос будет успешно завершен.

0 голосов
/ 01 июня 2018

На первом шаге, т. Е. Из браузера, у вас может быть некоторый идентификатор сеанса в куки, но здесь нет.

Кроме того, если вы нажали опцию remote:true, он получит токен аутентификации отстраница в скрытом поле.

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

...