如何在Rails,Devise和Backbone.js中使用令牌认证?

我正尝试在客户端使用PhoneGap,jQuery Mobile和Backbone.js构建移动应用程序,并使用运行服务器端的Rails 3 JSON API。

我知道如何在通过身份验证后从服务器获取令牌,但我不知道如何将“token_auth”键/值附加到Backbone.js将向我的服务器发出的所有AJAX请求。

这是我目前的流程:

  • 用户键入某些表单字段并点击“登录”
  • 主干使用电子邮件和密码信息创建一个新的Player对象。
  • 我运行一个Player.authenticate将令牌设置为AUTHENTICATION_TOKEN
  • 之后的所有请求都应附加“auth_token =”+ AUTHENTICATION_TOKEN
  • 我查看了http://documentcloud.github.com/backbone/#Sync,可能会重写AJAX调用 - 但对于这个简单的任务来说,这似乎相当极端。

    有没有人有任何运行Devise token_authentication和Backbone.js的经验?


    为什么不把它附加到所有的jQuery Ajax请求。 它会通过jQuery将auth_token添加到所有的ajax调用中。 直接使用jQuery ajax(或者这样做的库)可能会很有用。 但是这可能也是一个安全问题(当你有其他网站的Ajax调用...)。

    // this is untested
    $.ajaxSetup({ beforeSend : function(xhr, settings){ 
    
      // just because the auth_token is a private information
      if(!settings.crossDomain) {
    
        // parse data object
        var dataobj = JSON.parse(xhr.data);
    
        // add authentication token to the data object
        dataobj.auth_token = AUTHENTICATION_TOKEN;
    
        // save the dataobject into the jqXHR object
        xhr.data = JSON.stringify(dataobj); 
    
      }
    }});
    

    另一种方法可能是将该令牌写入标头并在服务器端进行处理:

    // thats not beautiful
    $.ajaxSetup({ headers : { "auth_token" : AUTHENTICATION_TOKEN } });
    

    关键是将其引入Backbone.sync方法。

    看看这个实现:https://github.com/codebrew/backbone-rails/blob/master/vendor/assets/javascripts/backbone_rails_sync.js

    您可以通过以下方式自行添加它:

    Backbone.old_sync = Backbone.sync
    Backbone.sync = function(method, model, options) {
        var new_options =  _.extend({
            beforeSend: function(xhr) {
                var token = $('meta[name="csrf-token"]').attr('content');
                if (token) xhr.setRequestHeader('X-CSRF-Token', token);
            }
        }, options)
        return Backbone.old_sync(method, model, new_options);
    };
    

    看看这个小提琴:http://jsfiddle.net/dira/ZcY3D/14/


    创建一个像这样的函数,在任何时候将ajax请求发送到服务器时都会发送它

    $(function(){
        $(document).ajaxSend(function(e, xhr, options) {
            var token = $("meta[name='csrf-token']").attr("content");
            xhr.setRequestHeader("X-CSRF-Token", token);
        });
    })
    
    链接地址: http://www.djcxy.com/p/49059.html

    上一篇: How use token authentication with Rails, Devise and Backbone.js?

    下一篇: why is this used?