2011-10-16 11 views
28

私はPhoneGap、jQuery Mobile、Backbone.jsをモバイル側に実装しようとしています.Rails 3 JSON APIをサーバ側で実行しています。Rails、Devise、Backbone.jsでのトークン認証の使い方は?

認証後にサーバーからトークンを取得する方法はわかっていますが、backbone.jsがサーバーに行うすべてのAJAX要求に「token_auth」キー/値を追加する方法はわかりません。

はここで、現時点での私の流れです:いくつかのフォームフィールドとヒットで

  1. ユーザータイプ「ログに」バックボーンは、メールアドレスとパスワードの情報を持つ新しいPlayerオブジェクトを作成します
  2. 。しかし - 私はこの後
  3. すべての要求をAUTHENTICATION_TOKENするトークンを設定しますPlayer.authenticateは「auth_token =」+ AUTHENTICATION_TOKEN

を追加する必要があり、私は多分、AJAX呼び出しをオーバーライドするためにhttp://documentcloud.github.com/backbone/#Sync見てきた実行

  • この単純な作業ではかなり極端に見えます。

    Devise token_authenticationとBackbone.jsを使用している人はいますか?

  • 答えて

    14

    なぜjqueryのすべてのAjaxリクエストにそれを追加しないでください。 jQueryを使用してすべてのajax呼び出しにauth_tokenを追加します。これは、jQuery ajax(またはそうするlibs)で直接作業するときに役立ちます。しかし、これはセキュリティ上の問題でもあります(あなたが他のサイトに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ヘッダーフィーチャを使用して認証機能を使用できるか、またはコントローラ# 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); 
        }); 
    }) 
    
    関連する問題