每个骨干同步请求发送令牌

imr*_*ane 10 javascript api coffeescript backbone.js

我的PHP api需要在我的前端Backbone应用程序的每个请求中提交用户令牌,以确保用户...

  1. 活跃
  2. 拥有访问资源的权限

在Backbone中设置这个的最简单方法是什么?我猜测唯一的方法是覆盖Backbone.sync,但代码会是什么样子?CoffeeScript首选.

编辑

还有两件事
1. /login如果我得到403: Access Forbidden Error
2,我想将用户重定向到2.我在应用程序引导时拉出包含来自localStorage的令牌的用户模型
3.我有一个baseModel和baseCollection,所有模型/集合来自

jac*_*cnr 18

Backbone使用jQuery的$ .ajax,因此您可以使用$ .ajaxSetup "为将来的Ajax请求设置默认值":

$.ajaxSetup({
   headers: {
     "accept": "application/json",
     "token": YOUR_TOKEN
   }
});
Run Code Online (Sandbox Code Playgroud)

更新:这个想法的改进(感谢@Glen)是每次使用$ .ajaxSend检查是否存在令牌,然后在请求的标头中设置它:

$(document).ajaxSend(function(event, request) {
   var token = App.getAuthToken();
   if (token) {
      request.setRequestHeader("token", token);
   }
});
Run Code Online (Sandbox Code Playgroud)

App.getAuthToken()是Backbone应用程序中的一个功能.

  • jQuery文档不建议使用`$ .ajaxSetup`.请参阅此处:http://api.jquery.com/jQuery.ajaxSetup/另一种方法是使用`$ .ajaxSend`添加相应的标头. (4认同)
  • 另请查看有关OAuth 2.0的讨论以及他们如何使用`$ .ajaxSend`在每个请求中传递令牌:http://youtu.be/khnmMv4_RCE?t = 13m40s (4认同)
  • `$ .ajaxSend`应根据``jQuery 1.9更改为`$(document).ajaxSend`,jQuery全局Ajax事件的所有处理程序,包括那些添加了.ajaxSend()方法的处理程序,必须附加到文件.[链接](http://api.jquery.com/ajaxSend/) (4认同)

Sim*_*ias 11

你可以这样做:

var _sync = Backbone.sync;
Backbone.sync = function(method, model, options) {

    if( model && (method === 'create' || method === 'update' || method === 'patch') ) {
        options.contentType = 'application/json';
        options.data = JSON.stringify(options.attrs || model.toJSON());
    }

    _.extend( options.data, {
        "access_token": "some-token"
    });

    return _sync.call( this, method, model, options );
}
Run Code Online (Sandbox Code Playgroud)

并且只是监听fetch/save方法的失败事件以将用户重定向到 /login

model.fetch().fail( /* redirect */ )
Run Code Online (Sandbox Code Playgroud)

  • 嘿,我今天遇到了一个讨论,这让我想到了你的问题.也许您可以使用[$ .ajaxSetup](http://api.jquery.com/jQuery.ajaxSetup/)设置包含您访问令牌的默认头(请参阅[$ .ajax]的`headers`选项(http:// api.jquery.com/jQuery.ajax/)) (3认同)