Загрузить и направить 3 токена подлинности

Я пытаюсь заставить индикатор выполнения загрузки файла работать в приложении rails 3, используя uploadify (http://www.uploadify.com), и я застрял на токенах подлинности. Моя текущая конфигурация загрузки выглядит так

            <script type="text/javascript" charset="utf-8">
             $(document).ready(function() {
                   $("#zip_input").uploadify({
                    'uploader': '/flash/uploadify.swf',
                    'script': $("#upload").attr('action'),
                    'scriptData': { 'format': 'json', 'authenticity_token': encodeURIComponent('<%= form_authenticity_token if protect_against_forgery? %>') },
                    'fileDataName': "world[zip]",
                    //'scriptAccess': 'always', // Incomment this, if for some reason it doesn't work
                    'auto': true,
                    'fileDesc': 'Zip files only',
                    'fileExt': '*.zip',
                    'width': 120, 
                    'height': 24,
                    'cancelImg': '/images/cancel.png',
                    'onComplete': function(event, data) { $.getScript(location.href) }, // We assume that we can refresh the list by doing a js get on the current page
                   'displayData': 'speed'
                   });
                 });
            </script>

Но я получаю этот ответ от рельсов:

Started POST "/worlds" for 127.0.0.1 at 2010-04-22 12:39:44

ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):


Rendered /opt/local/lib/ruby/gems/1.8/gems/actionpack-3.0.0.beta3/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.0ms)
Rendered /opt/local/lib/ruby/gems/1.8/gems/actionpack-3.0.0.beta3/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (6.6ms)
Rendered /opt/local/lib/ruby/gems/1.8/gems/actionpack-3.0.0.beta3/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (12.2ms)

Похоже, это связано с тем, что я не отправляю файл cookie аутентификации вместе с запросом. Кто-нибудь знает, как я могу получить значения, которые я должен отправить туда, и как я могу заставить рельсы читать их из HTTP POST, а не пытаться найти их как файл cookie?


person Ceilingfish    schedule 22.04.2010    source источник


Ответы (3)


Пропуск проверки токена подлинности не идеален, так как открывает векторы атаки XSS. Другой способ сделать это описан здесь: http://metautonomo.us/2010/07/09/uploadify-and-rails-3/

Обратите внимание, что вам может потребоваться двойное кодирование URL-адресов. В примере используются рельсы 'u', а также encodeURLComponent(). Однако, если вы настроили более причудливый тип/rails3 и получаете данные сеанса/маркер подлинности из метатегов в заголовке страницы, вам нужно будет дважды вызвать encodeURLComponent().

person dxg    schedule 25.07.2010
comment
У меня были серьезные проблемы с аутентичностью_токена, состоящей из символов «+». Ваше предложение решило мою проблему. Выполнение двойного u() является ключом. Есть ли разница в том, как работают escapeURIComponent и u()? - person mdrozdziel; 05.08.2010

Кажется, это ошибка с рельсами 3.

https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/3913

Это означало, что мне пришлось изменить способ пропуска проверки токена подлинности:

Изменено с

protect_from_forgery :except => :upload

To

skip_before_filter :verify_authenticity_token, :only => :upload

Который, кажется, все еще работает нормально

person Ceilingfish    schedule 19.05.2010

Ну, я понял, как обойти это. Есть ли форма в представлении, куда вы хотите загрузить файлы. Если вы просто используете jquery, чтобы получить значение скрытого токена аутентификации и передать его в переменную scriptData.

var token = ($('input[name=authenticity_token]').val());
scriptData : {'authenticity_token':token}

Надеюсь, что это работает для вас.

person mackintosh    schedule 12.05.2010
comment
Спасибо за ваше предложение, у меня еще не было возможности вернуться к этому проекту, но ваше предложение выглядит действительно полезным, как только у меня будет возможность заставить это работать, я вернусь к вам. - person Ceilingfish; 14.05.2010