【问题标题】:How to generate <%= csrf_meta_tags %> in public/index.html file如何在 public/index.html 文件中生成 <%= csrf_meta_tags %>
【发布时间】: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

如何省略这个,或者我必须在哪里生成我的&lt;%= csrf_meta_tags %&gt;,这样我才能使用我在网上找到的这种方法:

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


【解决方案1】:

您可以将 csrf_meta_tags 放入部分,然后从 public/index 向返回该部分的方法发出 ajax 请求。

【讨论】:

  • 这可能是一个解决方案
  • 是的,我在 index.html 的底部添加了window.onload = function (){$.post('csrf/generate_csrf_meta_tags', null, null, "script");}。 generate_csrf_meta_tags 渲染 js.erb 文件,我从中渲染 html.haml 文件,在该文件中生成了这个 meta_tags )))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 2014-07-15
  • 2011-09-09
  • 1970-01-01
相关资源
最近更新 更多