2

我有一个针对 Rails 3.2 后端的节点服务器中运行的 AngularJS 应用程序。我在 cookie/HTTP 标头中使用 CSRF 令牌(不是 <%= csrf_token %>)。Angular 可以毫无问题地 GET 和 POST 到 Rails。

我现在正在尝试实现“ http://blueimp.github.io/jQuery-File-Upload/angularjs.html ”。如果我启用了protect_from_forgery,我会得到(第一条消息是我的puts - 令牌不匹配):

VERIFIED_REQUEST 用户:请求:ROyZgMl6CUpbifI45b4URs2iJPRmCtg+mranU8A7xhA= form_authenticity_token f3+AZaCqzTOXTlwadMZIkOGpyqQFcXZ7ITbm87NUA04= 警告:无法验证 CSRF 令牌真实性已完成 401 未授权在 344 毫秒内

如果我删除protect_from_forgery,我不会收到CSRF 警告,但我仍然会收到401!一旦代码被部署(到 Rails 中的公用文件夹,因此是同一个域),同样的特性就可以完美地工作。

我已经尝试了几乎所有可以在 stackoverflow 和其他地方找到的解决方案,现在我正在拔头发。这是我目前配置的内容:

用户登录后,我将令牌设置在 cookie 中:

def after_set_user cookies['XSRF-TOKEN'] = form_authenticity_token ifprotect_against_forgery? puts("set_csrf_cookie_for_ng #{form_authenticity_token}") 结束

并根据请求标头检查令牌:

def 验证请求?puts("VERIFIED_REQUEST 用户:#{current_user} 请求:#{request.headers['X-XSRF-TOKEN']} form_authenticity_token #{form_authenticity_token}") 超级 || form_authenticity_token == request.headers['X-XSRF-TOKEN'] 结束

我已经实现了 rack_cors gem 来满足 OPTIONS 请求。

我有:

保护_from_forgery before_filter :authenticate_user!

在我的应用程序控制器中。

我有:

$.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 配置中。

4

1 回答 1

1

请在上传文件之前添加以下内容(在 jquery.fileupload.js 中)。

$.ajaxSetup({
   headers: {
       'X-XSRF-TOKEN': $.cookie("XSRF-TOKEN")
   }
});
于 2014-12-03T09:35:04.360 回答