2013-08-16 17 views
1

我有一個帶有Ember.js前端的Rails 4.0應用程序。我將Ember-Auth與Devise結合使用來處理認證。大多數情況下,一切正常。但是,如果我使用Jquery文件上傳,則後續對服務器的所有查詢都會導致InvalidAuthenticityToken錯誤。文件上傳本身完美,但如果我以後訪問組織索引頁,我會得到錯誤。如果我重新加載頁面,那麼錯誤就會停止,並且再次正常工作,直到我執行另一次上傳。使用jquery文件上傳後InvalidAuthenticityToken

上傳者看起來是這樣的:

didInsertElement: -> 
    $('#image_upload').fileupload 
    url: "/images" 
    formData: [{ name: 'auth_token', value: Whistlr.Auth.get('authToken') }] 
    success: (response) => 
     @get('parentView').get('controller').set('image_token', response.token) 

即使我刪除一切,但URL,我得到的InvalidAuthenticityToken之後。任何想法發生了什麼?

+0

也許問題是與csrf令牌。嘗試在formData中使用這個:[ ] –

+0

不幸的是,這並不是做訣竅。我也嘗試通過遵循[這些說明]將authenticity_token附加到所有ajax交易(http://blog.waymondo.com/2012-12-18-ember-dot-js-and-rails-authentication-gotchas/) ,但問題仍然存在。任何意見,將不勝感激!我在這個問題上開了一筆獎金。 – nullnullnull

+0

閱讀[Rails文檔](http://guides.rubyonrails.org/security.html#csrf-countermeasures),它看起來像authenticity_token特定於每個會話。也許錯誤發生是因爲會話在JQuery文件上傳過程中以某種方式被重置? – nullnullnull

回答

0

繼我懷疑會話正在重置,我嘗試從服務器傳回客戶端的authenticity_token。當然,它正在改變。所以我手動將新的authenticity_token放在標題中。代碼如下所示:

def create 
    image = Image.create(image_params) 
    render json: {image: image, authenticity_token: form_authenticity_token}, status: 201 
end 

$('#image_upload').fileupload 
    url: "/images" 
    dataType: "json" 
    formData: [{ name: 'auth_token', value: Whistlr.Auth.get('authToken') }] 
    success: (response) => 
    @get('parentView').get('controller').set('image_token', response.image.token) 
    $('meta[name="csrf-token"]').attr('content', response.authenticity_token) 

請注意JavaScript的最後一行,它取代了csrf-token。謝天謝地,這工作。據我所知,這也是安全的。 (如果你看到安全漏洞,請告訴我!)但是這似乎很奇怪,這是必要的。我的應用程序中沒有其他地方需要手動替換csrf令牌。這是爲什麼發生在這裏?是否因爲會話正在重置,如果是這樣,爲什麼會發生在這裏,而不是在其他地方?