Uploadify и рельсы 3 жетона подлинности - PullRequest
4 голосов
/ 22 апреля 2010

Я пытаюсь заставить работать индикатор загрузки файла в приложении 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>

Но я получаю этот ответ от rails:

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?

Ответы [ 3 ]

3 голосов
/ 19 мая 2010

Это похоже на ошибку с рельсами 3.

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

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

Изменено с

protect_from_forgery :except => :upload

К

skip_before_filter :verify_authenticity_token, :only => :upload

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

3 голосов
/ 25 июля 2010

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

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

2 голосов
/ 12 мая 2010

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

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

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

...