Придумать, чтобы выходить из строя по почте на другой маршрут

У меня действительно странная проблема с 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%>