如何使用Rails,Devise和Backbone.js进行令牌认证?
我正在尝试使用PhoneGap,jQuery Mobile和Backbone.js在客户端构建移动应用程序 – 使用运行服务器端的Rails 3 JSON API。
我知道如何在经过身份validation后从服务器获取令牌,但我不知道如何将“token_auth”键/值附加到Backbone.js将对我的服务器进行的所有AJAX请求。
这是我目前的流程:
- 用户在某些表单字段中键入并点击“登录”
- Backbone使用电子邮件和密码信息创建一个新的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(或者这样做的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 } });
关键是在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); }); })