Придумать выход на почту по другому маршруту - PullRequest
13 голосов
/ 25 мая 2011

У меня действительно странная проблема с Devise. У меня есть настроенный маршрут, который принимает и получает и отправляет запросы. При получении, он показывает форму, на почте, он представляет его.

Когда я отправляю сообщение XHR на маршрут, когда он туда попадает, он сообщает, что я не вошел в систему, и отправляет мне 401 неавторизованный. После этого я должен войти в систему, а затем я могу попробовать еще раз.

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

Кроме того, если я открою форму, но не отправлю ее, я смогу продолжить как обычно. Где-то в этом XHR он создает устройство, чтобы выйти из системы.

Если у вас есть идеи, пожалуйста, помогите, я понятия не имею, что происходит сейчас ...

Спасибо

-Скотт

РЕДАКТИРОВАТЬ: Добавление соответствующих частей кода

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);
        }

Если я пропустил какой-то соответствующий кусок кода, дайте мне знать

Ответы [ 2 ]

24 голосов
/ 02 июня 2011

Здесь не так много, кроме JS, но есть действительно сильное изменение, у вас возникла проблема, потому что токен CSRF не был установлен как часть вашего запроса.Это изменилось в различных версиях Rails 3.0.x, поэтому его трудно узнать наверняка без кода.

Один простой простой тест - отключить CSRF (например, удалить protect_from_forgery из ApplicationController).Если это сработает, у вас есть ответ, и вам нужно убедиться, что токен будет разослан, или вы иным образом применяете защиту от подделки.

0 голосов
/ 21 апреля 2014

Я столкнулся с той же проблемой, когда у меня есть две формы на одной странице, одна из которых публикует маршрут в приложении, а другая - на внешний адрес.Джон Пол Ашенфелтер прав, что он не имеет ничего общего с JS.

Как и вы, я не хочу отключать CSRF для всего сайта.Я закончил тем, что отключил защиту от подделки для метода, который отправляет на адрес за пределами сайта в контроллере:

protect_from_forgery :except => [:some_method]

И в форме, которая создает эту проблему CSRF:

<%= form_for :some_model, authenticity_token: false do%>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...