覆盖骨干.同步Rails API认证与设计

Override Backbone.sync for Rails API authentication with Devise

本文关键字:认证 API Rails 同步 覆盖      更新时间:2023-09-26

我试图重写骨干的.sync方法,以便为我的Rails API进行身份验证。我已经离开了这篇文章,我觉得我真的很接近弄清楚它。我有铁路方面的设置,但我有麻烦的事情的前端。我被另一篇文章中的部分卡住了

var token = YourAppName.csrfToken;

我不太确定用什么代替'YourAppName'。这是我到目前为止的主干代码。我的应用程序叫做' dropin ',当我把它加入时,我得到错误说它没有定义。

// overide backbone.sync
Backbone._sync = Backbone.sync;
Backbone.sync = function(method, model, options) {
  if (!options.noCSRF) {
    var beforeSend = options.beforeSend;
    // Set X-CSRF-Token HTTP header
    options.beforeSend = function(xhr) {
      var token = Droppin.csrfToken;  
      if (token) xhr.setRequestHeader('X-CSRF-Token', token);
      // this will include session information in the requests
      xhr.withCredentials = true;
      if (beforeSend) return beforeSend.apply(this, arguments);
    };
  }
  var complete = options.complete;
  options.complete = function(jqXHR, textStatus) {
     // If response includes CSRF token we need to remember it
     var token = jqXHR.getResponseHeader('X-CSRF-Token') 
     if (token) Droppin.csrfToken = token;
     model.trigger('sync:end');
     if (complete) complete(jqXHR, textStatus);
  };
  // Serialize data, optionally using paramRoot
  if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {
    options.contentType = 'application/json';
    data = JSON.stringify(options.attrs || model.toJSON(options));
    if (model.paramRoot) {
      data = {};
      data[model.paramRoot] = model.toJSON(options);
    } else {
      data = model.toJSON();
    }
    options.data = JSON.stringify(data);
  }
  return Backbone._sync(method, model, options);
};

我需要做什么才能抓住CSRF令牌并将其正确地附加到HTTP标头?我还应该提到,我正在使用require.js,并正在处理main.js文件中的覆盖(不确定这是否是正确的地方)。

您是否事先在代码的其他地方定义了Dropping ?例如,

window.Droppin = window.Dropping || {};

如果没有,当你尝试执行var token = Droppin.csrfToken;时,Droppin将是未定义的,因此不会有属性csrfToken