我有一个针对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")
}
});