2011-10-16 63 views
28

我想在客戶端使用PhoneGap,jQuery Mobile和Backbone.js構建移動應用程序 - 使用運行服務器端的Rails 3 JSON API。如何在Rails,Devise和Backbone.js中使用令牌認證?

我知道如何在通過身份驗證後從服務器獲取令牌,但我不知道如何將「token_auth」鍵/值附加到Backbone.js將向我的服務器發出的所有AJAX請求。

這是我流的時刻:在某些表單字段和命中

  1. 用戶類型「登錄」
  2. 骨幹創建具有電子郵件地址和密碼信息新的Player對象。
  3. 我運行一個Player.authenticate那臺令牌AUTHENTICATION_TOKEN
  4. 後本應追加的所有要求「的auth_token =」 + AUTHENTICATION_TOKEN

我已經看了http://documentcloud.github.com/backbone/#Sync的可能重寫AJAX調用 - 但這對於這個簡單的任務似乎相當極端。

有沒有人有任何運行Devise token_authentication和Backbone.js的經驗?

回答

14

爲什麼不把它附加到所有的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 } }); 
+0

我真的很喜歡這種方法!這是描述性的,更接近我想要實現的目標!謝謝:) – theodorton

+1

是的,方法是清潔的。但是,是不是需要解析和字符串化數據,認證令牌可以使用HTTP標頭髮送。另外,它不需要GET請求。 我更新了演示:http://jsfiddle.net/dira/ZcY3D/18/ – dira

+0

只是爲未來:是能夠通過自定義HTTP認證headerfields有一項功能或者是Rails的約定,列出他們控制器# PARAMS? – abstraktor

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/

+0

這是解決問題的一種編程方式很好的方法,但我喜歡代碼更接近問題的文本「解決方案」。這將工作,雖然,我猜:) – theodorton

+1

只是回不去看這個問題 - 而這個答案沒有被標記爲接受的原因是因爲它使用CSRF令牌。雖然我們可以改變'var token ='這一行來使它與任何其他變量一起工作。 – theodorton

+1

不要忘了返回old_sync「return Backbone.old_sync(method,model,new_options);」保持鏈接並避免新主幹版本出現問題。 – panchicore

1

創建這樣的函數,將發送任何時候ajax請求被髮送到服務器

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