web-dev-qa-db-ja.com

Rails、Devise、Backbone.jsでトークン認証をどのように使用しますか?

クライアント側でPhoneGap、jQuery Mobile、Backbone.jsを使用してモバイルアプリケーションを構築しようとしています-サーバー側でRails 3 JSONAPIを実行しています。

認証後にサーバーからトークンをフェッチする方法は知っていますが、Backbone.jsがサーバーに対して行うすべてのAJAXリクエストに「token_auth」キー/値を追加する方法がわかりません。

現時点での私の流れは次のとおりです。

  1. ユーザーがいくつかのフォームフィールドに入力し、「ログイン」を押します
  2. バックボーンは、電子メールとパスワードの情報を使用して新しいPlayerオブジェクトを作成します。
  3. トークンをAUTHENTICATION_TOKENに設定するPlayer.authenticateを実行します
  4. この後のすべてのリクエストには、「auth_token = "+ AUTHENTICATION_TOKEN」を追加する必要があります

私は http://documentcloud.github.com/backbone/#Sync AJAX呼び出しをオーバーライドするために)==を見てきましたが、これはこの単純なものとしてはかなり極端に思えます仕事。

Devise token_authenticationとBackbone.jsを実行した経験のある人はいますか?

28
theodorton

すべてのjqueryajaxリクエストに追加しないのはなぜですか。これにより、jQueryを介したすべてのajax呼び出しにauth_tokenが追加されます。これは、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 } });
14
abstraktor

重要なのは、それを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/

26
dira

Ajaxリクエストがサーバーに送信されるたびに送信するこのような関数を作成します

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