Переопределение рейлов

Для отправки формы требуется токен, названный принимающим сервером authenticity_token и ожидает строку, которая известна только отправляющим и получающим серверам:

<input id="authenticity_token" name="authenticity_token" type="hidden" value="ac513de198a9f0536df5003fb5ba3122d1ee53d5" />

это значение отображается, если я вызываю экземпляр или глобальную переменную. Однако, хотя контроллер установлен со следующим фильтром:

  skip_before_action :verify_authenticity_token, only: [:reservation]

пытаюсь ли я

<%= form_tag('https://test.webten.net/form') do %>
<%= hidden_field_tag :authenticity_token, @ppayment.authenticity_token, id: "authenticity_token" %>

или же

<%= tag(:input, type: "hidden", name: request_forgery_protection_token.to_s, value: @ppayment.authenticity_token) %>

или же

<input id="" name="authenticity_token" type="hidden" value="ac513de198a9f0536df5003fb5ba3122d1ee53d5" />

Rails заканчивает сжатие каждого значения своим собственным значением настройки сеанса и рендерингом:

<input type="hidden" name="authenticity_token" id="authenticity_token" value="ydi5En1ywUkN5VsYIBXu6JTbQmXtwxNhpKlyjbbLi3RdvCc+A59EdDZvroGsGFplAAE5ATLcSqw25LVQkyPtKw==">
<input type="hidden" name="authenticity_token" value="ydi5En1ywUkN5VsYIBXu6JTbQmXtwxNhpKlyjbbLi3RdvCc+A59EdDZvroGsGFplAAE5ATLcSqw25LVQkyPtKw==">
<input id="authenticity_token" name="authenticity_token" type="hidden" value="ydi5En1ywUkN5VsYIBXu6JTbQmXtwxNhpKlyjbbLi3RdvCc+A59EdDZvroGsGFplAAE5ATLcSqw25LVQkyPtKw==">

Как можно изменить поведение по умолчанию для rails в этом действии контроллера?

2 ответа

Решение

[ этот ответ дополняет предыдущий. Это решает проблему, но не элегантно ]

Различные возможные пути решения проблемы кажутся неполными

  • form_authenticity_token является помощником вида, который возвращает токен аутентификации текущего сеанса Слишком поздно что-то предпринимать, поскольку макет может уже вызывать его
  • наиболее проголосовавший ответ имеет метод за действие protect_from_forgery за игнорирование его для внутренних целей. Все еще слишком поздно, поскольку сессия уже выпустила это
  • пропуск до действия аналогичен предыдущему решению, слишком поздно, выдан токен сеанса
  • Направляющая рельсов неверна в заявлении: authenticity_token: 'external_token'

Aaron Breckenridge Ответ дает подсказку: "у вас, вероятно, есть какой-то JS, который перезаписывает маркер подлинности", поддерживаемый этой публикацией. Таким образом, можно искать содержимое каталога приложения и все еще не найти обработчик JS... когда, например, jquery-ujs установлен gem. Основываясь на наблюдаемом поведении, он должен быть запущен каждый раз, когда сталкивается name='authenticity-token' и устанавливает значение на основе мета-тэга (логично. зачем иметь 2 разных токена на одной странице...) - все делает правильно!

Буквально этот токен не должен генерироваться выше по течению. Итак, изменив заголовок раздела макета:

<% unless  request.path == "/controller/action" %>
  <%= csrf_meta_tags %>
<% end %>

это рабочий раствор. Это решение подвержено загрязнению для нескольких путей. Другой требует многократной обработки макета... таким образом, файл в разделе 'kludgey'. (готов развлечь лучшего!)

Вы должны переопределить :authenticity_token аргумент в form_tag вызов, чтобы Rails не добавил токен аутентификации сеанса по умолчанию:

<%= form_tag('https://test.webten.net/form', authenticity_token: 'ac513de198a9f0536df5003fb5ba3122d1ee53d5') do %>

или же:

<%= form_tag('https://test.webten.net/form', authenticity_token: false) do %>
  <%= hidden_field_tag 'authenticity_token', 'ac513de198a9f0536df5003fb5ba3122d1ee53d5' %>

Если это не сработает, возможно, у вас есть какой-то JS, который перезаписывает маркер подлинности, который вы указали в метке META. Ищите "csrf-token" в вашем JS.

См. http://guides.rubyonrails.org/form_helpers.html для получения дополнительной информации.

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