我有一个带有Ember.js前端的Rails 4.0应用程序。我正在使用Ember-Auth与Devise一起处理身份验证。在大多数情况下,一切都有效。但是,如果我使用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 :(得分: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-token。为什么会发生这种情况?是因为会话正在重置,如果是,为什么会发生在这里,而不是在其他地方?