Придумать, чтобы выходить из строя по почте на другой маршрут
У меня действительно странная проблема с Devise. У меня есть настроенный маршрут, который принимает запросы на получение и отправку. На get, он показывает форму, на почте, она отправляет ее.
Когда я отправляю сообщение XHR на маршрут, когда он туда добирается, он сообщает мне, что я не вошел в систему и отправил мне 401 несанкционированного доступа. После этого мне нужно войти в систему, а затем я могу попробовать еще раз.
Я пытался понять это в течение нескольких часов, все, что мне удалось выяснить, это то, что мой метод контроллера не вызван. Я включил свой собственный пользовательский пароль перед фильтром, и он просто подтвердил, что к моменту, когда будет вызвано приложение rails, пользователь больше не войдет в систему.
Кроме того, если я открываю форму, но не отправляю ее, я могу продолжить, как обычно. Где-то в этом XHR это заставляет меня выходить из системы.
Если у вас есть идеи, пожалуйста, помогите, я понятия не имею, что происходит прямо сейчас...
Спасибо
-Скотт
EDIT: добавление соответствующих фрагментов кода
routes.rb
match 'projects/:p/filebox' => 'projects#show', :via => ["get","post"], :as => 'project_filebox'
projects_controller.rb
before_filter :authenticate_user! # <--- By the time this gets called, the user is logged out
def show
# ^^^^ Doesnt get called. Logger shows that it recognized route though
logger.debug "-----------projects#show"
logger.debug "Current user logged in:"+user_signed_in?.to_s
который отправляется
<form class="upload" action="<%= project_filebox_path(@project) %>?n=7&cType=<%= cType %>&fid=<%= fid %>" method="post" enctype="multipart/form-data">
<input type="file" name="file" multiple/>
<button>Upload</button>
<div>Add / Drag Files To Upload</div>
</form>
Javascript, загружающий XHR
formDataUpload = function (files, xhr, settings) {
var formData = new FormData(),
i;
$.each(getFormData(settings), function (index, field) {
formData.append(field.name, field.value);
});
for (i = 0; i < files.length; i += 1) {
formData.append(settings.fieldName, files[i]);
}
xhr.send(formData);
}
Если я пропустил какой-то соответствующий фрагмент кода, дайте мне знать
Ответы
Ответ 1
Здесь не так много, кроме JS, но там действительно сильное изменение у вас возникает, потому что токен CSRF не устанавливается как часть вашего запроса. Это было изменено в различных версиях Rails 3.0.x, так что трудно знать без кода.
Один мертвый простой тест - отключить CSRF (например, удалить protect_from_forgery из ApplicationController). Если это сработает, у вас есть ответ и нужно убедиться, что токен передан или вы в противном случае справляетесь с защитой подделок.
Ответ 2
Я столкнулся с той же проблемой, когда у меня есть две формы на одной странице, одна из них отправляется на маршрут внутри приложения, а другая - на внешний адрес. Джон Пол Эшенфельтер прав, что он не имеет ничего общего с JS.
Как и вы, я не хочу отключать CSRF для всего сайта. Я в конечном итоге отключил защиту от подделки для метода, который отправляет на адрес вне сайта в контроллере:
protect_from_forgery :except => [:some_method]
И в форме, которая создает эту проблему CSRF:
<%= form_for :some_model, authenticity_token: false do%>