2

ログイン時に Cookie を返さず、json 応答の一部として auth_token のみを返す API を使用しています。

ベース URL は backbonejs アプリケーションを配信します。http://www.webiyo.com/と言うと、デフォルトでログインページが表示されます。

ユーザーが backbonejs アプリでページを更新しても、ユーザー セッションを維持したい。

問題は、API がセッション cookie 別名 auth_token cookie を返さないことです (クエリ文字列の後続のすべての呼び出しで渡す必要がある応答 json で auth_token を返すだけです)。

そのような状況では、 backbonejs を使用してブラウザー側でユーザーセッションを追跡するために、自分で javascript cookie を設定できますか? はいの場合、どのように?

参照してきました

http://whatcodecraves.com/articles/2012/01/11/backbonejs-sessions-and-authenticationしかし、私の場合とは異なり、ログイン成功時に http cookie "auth_token" がサーバーからブラウザに直接送信されることを前提としています " auth_token" は、ログイン成功時の json 応答の一部です。

4

1 に答える 1

4

あなたが説明したことに基づいてauth_token、ブラウザーのセッション Cookie に保存するのが良い方法のようです。

Backbone.js は Cookie 操作をサポートしていません。ただし、jQuery プラグインを使用するか、独自の Cookie マニピュレータを記述してこれを処理できます。

jquery-cookie( https://github.com/carhartl/jquery-cookie )を使用していると仮定すると、これを達成する方法の例を次に示します(Wikiにもあります!):

$.cookie('auth_token', authTokenValue);

対話する API については、API が をどのように受け入れるかによって異なります。自動的auth_tokenに使用を処理するために、Backbone.Model の上に BaseModel を作成する必要がある場合があります。auth_token

たとえば、APIauth_tokenが QueryString の一部としてを渡すことを想定している場合、Backbone.Model.url()関数をオーバーライドする必要があります。

var BaseModel = Backbone.Model.extend({
url: function() {
        var base = _.result(this, 'urlRoot') || _.result(this.collection, 'url') || urlError();
        if (this.isNew()) return base + '?' + $.cookie('auth_token');
        return base + (base.charAt(base.length - 1) === '/' ? '' : '/') + encodeURIComponent(this.id) + '?' + $.cookie('auth_token');
    }
});

var EntityModel = BaseModel.extend({ ... });

したがって、Backbone.Model をオーバーライドする方法は、API エンドポイントが期待するものによって異なります。

これに従うことが最終的な目標である場合、できることがいくつかあります。

App.Models.Session = Backbone.Model.extend
  defaults:
    access_token: null,
    user_id: null

  initialize: ->
    @load()

  authenticated: ->
    Boolean(@get("auth_token"))

  login: (email, password, options)->
    # make an AJAX call to the authentication API
    # once returned, call @save(...) with auth_token that you got back.
    # options is there to facilitate that, if you want to pass in an onAuthencated or onNotAuthenticated callbacks, you can.

  # Saves session information to cookie
  save: (auth_token)->
    $.cookie('auth_token', auth_token)

  # Loads session information from cookie
  load: ->
    @set
      access_token: $.cookie('auth_token')

App.start = ->
  @session = new App.Models.Session()
  if @session.authenticated()
    # redirect to user page
  else
    # launch a login form
    # call @session.login(email, password)

option補足として、 @login(email, password, options) でパラメーターを使用する代わりに@trigger('authenticated')、モデルからのようにイベントをトリガーして、ユーザーが認証されたことをビュー/アプリに知らせることもできます。

于 2013-02-06T11:42:03.853 に答える