我有一个针对 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 配置中。