我有一个针对Rails 3.2后端的节点服务器中运行的AngularJS应用。我在cookie / HTTP标头中使用CSRF令牌(不是)。 Angular可以毫无问题地获取和发布到Rails。

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

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

如果删除protect_from_forgery,则不会收到CSRF警告,但仍然会收到401!一旦部署了代码(将其部署到Rails的公共文件夹中,因此是相同的域),该功能就可以完美地工作。

我已经尝试了在stackoverflow和其他地方可以找到的几乎所有解决方案,现在我正忙得不可开交。这是我到目前为止已配置的内容:

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

def after_set_user
Cookies ['XSRF-TOKEN'] = form_authenticity_token(如果protect_against_forgery)?
puts(“ set_csrf_cookie_for_ng#{form_authenticity_token}”)
结束

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

def verify_request?
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的请求。

我有:

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

最佳答案

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


$.ajaxSetup({
   headers: {
       'X-XSRF-TOKEN': $.cookie("XSRF-TOKEN")
   }
});

10-04 16:45