4

uploadify ( http://www.uploadify.com ) を使用して Rails 3 アプリで動作するファイル アップロードの進行状況バーを取得しようとしていますが、認証トークンに行き詰まっています。私の現在のアップロード設定は次のようになります

            <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 を送信していないことが原因のようです。そこに送信する必要がある値を取得する方法と、レールを Cookie として見つけようとするのではなく、HTTP POST から読み取らせる方法を知っている人はいますか?

4

3 に答える 3

3

これは Rails 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

まだうまくいくようです

于 2010-05-19T09:30:55.977 に答える
3

真正性トークンのチェックをスキップすることは、XSS 攻撃ベクトルを開くため、理想的ではありません。この作業を行う別の方法については、http: //metautonomo.us/2010/07/09/uploadify-and-rails-3/で説明しています。

二重の URL エンコードが必要になる場合があることに注意してください。この例では、レール「u」とencodeURLComponent()が使用されています。ただし、よりファンシーな Rails3 タイプをセットアップし、ページ ヘッダーのメタ タグからセッション データ/認証トークンを取得する場合は、encodeURLComponent() を 2 回呼び出す必要があります。

于 2010-07-25T06:28:25.027 に答える
2

さて、私はそれを回避する方法を考え出しました。ファイルをアップロードするビューにフォームがありますか。jquery を使用して非表示の認証トークンの値を取得し、それを scriptData 変数に渡す場合。

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

これがうまくいくことを願っています。

于 2010-05-12T12:04:05.693 に答える