1

我有一个带有 Ember.js 前端的 Rails 4.0 应用程序。我将 Ember-Auth 与 Devise 结合使用来处理身份验证。在大多数情况下,一切正常。但是,如果我使用 Jquery File Upload,那么对服务器的所有后续查询都会导致 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。知道发生了什么吗?

4

1 回答 1

0

在我怀疑会话正在重置之后,我尝试将authentity_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-token。为什么会在这里发生?是不是因为会话正在重置,如果是这样,为什么会发生在这里而不是其他地方?

于 2013-09-17T20:14:53.750 回答