我有一个 AngularJS 应用程序在 Rails 3.2 后端的节点服务器中运行。我在 cookie/HTTP header 中使用 CSRF token (不是 <%= csrf_token %>)。 Angular 可以毫无问题地 GET 和 POST 到 Rails。
我现在正在尝试实现'http://blueimp.github.io/jQuery-File-Upload/angularjs.html '。如果我启用了protect_from_forgery,我会得到(第一条消息是我的看跌期权 - token 不匹配):
VERIFIED_REQUEST 用户:请求:ROyZgMl6CUpbifI45b4URs2iJPRmCtg+mranU8A7xhA= form_authenticity_token f3+AZaCqzTOXTlwadMZIkOGpyqQFcXZ7ITbm87NUA04= 警告:无法验证 CSRF token 的真实性 在 344 毫秒内完成 401 未经授权
如果我删除protect_from_forgery,我不会收到CSRF警告,但我仍然收到401!一旦代码被部署(部署到 Rails 中的公共(public)文件夹,因此是相同的域),相同的功能就可以完美运行。
我已经尝试了几乎所有我能在 stackoverflow 和其他地方找到的解决方案,现在我正在抓狂。这是我现在的配置:
我在用户登录后在 cookie 中设置 token :
def after_set_user cookies['XSRF-TOKEN'] = form_authenticity_token 如果 protected_against_forgery? 投入(“set_csrf_cookie_for_ng#{form_authenticity_token}”) 结束
并根据请求 header 检查 token :
def 验证请求? put("VERIFIED_REQUEST 用户:#{current_user} 请求:#{request.headers['X-XSRF-TOKEN']} form_authenticity_token #{form_authenticity_token}") super || form_authenticity_token == request.headers['X-XSRF-TOKEN'] 结束
我已经实现了rack_cors gem 来满足 OPTIONS 请求。
我有:
防止伪造 before_filter :authenticate_user!
在我的应用程序 Controller 中。
我有:
$.ajaxSetup({
headers: {
'X-XSRF-TOKEN': $cookies['XSRF-TOKEN'],
'X-CSRF-Token': $cookies['XSRF-TOKEN']
}
});
在我的 Angular 范围的顶部。
我有这个:
删除 $http.defaults.headers.common["X-Requested-With"];
在我的 Angular app.js 配置中。
最佳答案
请在上传文件之前添加以下内容(在 jquery.fileupload.js 中)。
$.ajaxSetup({ headers: { 'X-XSRF-TOKEN': $.cookie("XSRF-TOKEN") } });
关于jquery - AngularJS (Blueimp Jquery-file-uploader) 与 Rails + Devise - 已完成 401 未经授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17749310/