在Backbone JS中保持会话跨页重新加载

时间:2013-02-05 15:19:59

标签: javascript rest backbone.js session-cookies

我正在使用一个API,它在登录时不返回cookie,但只有一个auth_token作为json响应的一部分。

基本URL提供backbonejs应用程序。说http://www.webiyo.com/,默认显示登录页面。

即使用户刷新了backbonejs app中的页面,我仍希望保留用户会话。

问题是我的API没有返回会话cookie aka auth_token cookie(它只返回响应json中的auth_token,需要在查询字符串中的所有后续调用上传递)

所以在这种情况下我可以自己设置一个javascript cookie来使用backbonejs跟踪浏览器端的用户会话吗?如果是的话怎么样?

我一直在指

http://whatcodecraves.com/articles/2012/01/11/backbonejs-sessions-and-authentication但它假设http cookie“auth_token”在登录成功时直接从服务器发送到浏览器,这与我的情况不同,其中“auth_token”是登录成功时json响应的一部分。

1 个答案:

答案 0 :(得分:4)

根据您的描述,将auth_token存储在浏览器的会话cookie中似乎是可行的方法。

Backbone.js不支持cookie操作。但是,您可以使用jQuery插件/编写自己的cookie操纵器来处理此问题。

假设你正在使用jquery-cookiehttps://github.com/carhartl/jquery-cookie),这里有一个关于如何实现这个目标的例子(它也在他们的Wiki上!):

$.cookie('auth_token', authTokenValue);

对于与之交互的API,取决于他们接受auth_token的方式,您可能需要在Backbone.Model之上创建一个BaseModel来自动处理auth_token的使用。

例如,如果API希望您将auth_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端点所期望的内容。

如果跟随this是你的最终目标,那么你可以做几件事:

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)

作为旁注,不是在@login(电子邮件,密码,选项)中使用option参数,而是还可以从模型中触发事件,例如@trigger('authenticated'),让View /应用程序知道用户现在已通过身份验证。