【发布时间】:2013-08-17 02:56:56
【问题描述】:
我在前端使用 Backbone,在后端使用 Ruby on Rails。我设计了 gem,用于我的身份验证。几天前,前端团队完成了他们的部分工作,现在我需要将它们绑定在一起。因此,我尝试通过请求Started POST "/users/sign_in.json" 使用json 槽骨干(标准方式)发送数据,即使我将protect_from_forgery except: :create 放在我的自定义会话控制器中,我也会收到错误Completed 401 Unauthorized in 180ms。像这样:
class UserSessions::SessionsController < Devise::SessionsController
protect_from_forgery except: :create
......
end
如何省略这个,或者我必须在哪里生成我的<%= csrf_meta_tags %>,这样我才能使用我在网上找到的这种方法:
App.csrfToken = $("meta[name='csrf-token']").attr('content');
Backbone.sync = (function(original) {
return function(method, model, options) {
options.beforeSend = function(xhr) {
xhr.setRequestHeader('X-CSRF-Token', App.csrfToken);
};
original(method, model, options);
};
})(Backbone.sync);
我无法将其移回标准 Rails 资产管道,因为前端是与我的后端分开编写的,后端依赖于 require.js。
【问题讨论】:
-
你需要在前端的某处渲染标签,使用 csrf_meta_tags。你可以在某个地方使用 Javascript 来获取它们。
-
问题是
how to do this我不能在我的公用文件夹中使用 .erb 扩展名。如果我这样做,那么我的 rails/views 正在加载(( -
好的,尝试将其添加到您的会话控制器中,以完全关闭 CSRF 检查:skip_before_filter :verify_authenticity_token
标签: ruby-on-rails backbone.js devise csrf-protection