ActionController:: InvalidAuthenticityToken при отключении запроса JS/Ajax
У меня две формы с опцией remote: true
; один отправляет запрос Ajax на действие create
, а другой отправляет запрос Ajax на действие destroy
.
Все рабочие штрафы, когда JavaScript включен, но если я отключу JavaScript, то я нажму, я получаю эту ошибку:
ActionController::InvalidAuthenticityToken PersonsController#create
Почему эта ошибка показана и как ее исправить?
Примечание: я использую Rails 4
Update
Когда я использую обычную форму без опции remote: true
, рельсы автоматически вставляют скрытое поле для токена аутентификации, но когда я использую remote: true
в моей форме, в коде HTML нет такого поля. Похоже, когда есть опция remote
, тогда Rails по-разному обрабатывает токен аутентификации, так как я могу заставить это работать в обоих случаях?
Ответы
Ответ 1
В Bizarrely это поведение было изменено в rails 4. http://www.alfajango.com/blog/rails-4-whats-new/
Формы Rails теперь не будут отображать поле CSRF в форме, если вы явно не определяете его как вариант для вашей формы:
<%= form_for @some_model, :remote => true, :authenticity_token => true do |f| %>
<% end %>
Добавление этой опции позволяет изящно деградировать в резерв HTML, если Javascript отключен.
Ответ 2
У меня тоже была та же проблема. Я использовал form_tag для создания пользовательской удаленной формы, но я получил следующую ошибку:
ActionController::InvalidAuthenticityToken
Я обнаружил, что это связано с тем, что по умолчанию в рельсе 4 не добавляется аутентичность toke, поэтому я добавил следующую строку в файл application.rb,
config.action_view.embed_authenticity_token_in_remote_forms = true
который автоматически проверяет токен при отправке удаленных форм. Это решает проблему для меня. Надеюсь, это поможет кому-то.
Ответ 3
В моем случае мне просто нужно было добавить эту строку на моей странице:
<%= csrf_meta_tags %>
Ответ 4
Если в форме нет поля csrf (скрытое поле), представление не может быть аутентифицировано сервером Rails.
Если вы сделаете форму form_tag
, это произойдет. Лучше использовать form_for
для ресурса (новый объект или существующий объект в db), и поле csrf будет автоматически создано Rails.
Ответ 5
Знаете ли вы, что эти функции были добавлены для защиты и защиты подделок.
Однако, чтобы ответить на ваш вопрос, вот некоторые материалы.
Вы можете добавить эти строки после имени контроллера.
Таким образом,
class NameController < ApplicationController
skip_before_action :verify_authenticity_token
Вот несколько строк для разных версий рельсов.
Рельсы 3
skip_before_filter: verify_authenticity_token
Rails 4:
skip_before_action: verify_authenticity_token
Если вы намерены отключить эту функцию безопасности для всех подпрограмм контроллера, вы можете изменить значение protect_from_forgery на : null_session в файле application_controller.rb.
Таким образом,
class ApplicationController < ActionController::Base
protect_from_forgery with: :null_session
end