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

时间:2011-10-16 14:58:54

标签: ruby-on-rails authentication devise backbone.js

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

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

这是我目前的流程:

  1. 某些表单字段中的用户类型并点击“登录”
  2. Backbone使用电子邮件和密码信息创建一个新的Player对象。
  3. 我运行一个将令牌设置为AUTHENTICATION_TOKEN的Player.authenticate
  4. 此后的所有请求都应附加“auth_token =”+ AUTHENTICATION_TOKEN
  5. 我看过http://documentcloud.github.com/backbone/#Sync可能会覆盖AJAX调用 - 但这对于这个简单的任务来说似乎非常极端。

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

3 个答案:

答案 0 :(得分:26)

关键是要在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/

答案 1 :(得分:14)

为什么不将它附加到你的所有jquery ajax请求中。它会将auth_token添加到jQuery上的所有ajax调用中。当直接使用jQuery ajax(或者这样做的lib)时,这可能很有用。但这也可能是一个安全问题(当你对其他网站进行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 } });

答案 2 :(得分:1)

创建一个这样的函数,只要将ajax请求发送到服务器

,它就会发送它
$(function(){
    $(document).ajaxSend(function(e, xhr, options) {
        var token = $("meta[name='csrf-token']").attr("content");
        xhr.setRequestHeader("X-CSRF-Token", token);
    });
})