2

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

基本 URL 提供了主干js 应用程序。说http://www.webiyo.com/并默认显示登录页面。

即使用户刷新了backbonejs应用程序中的页面,我也想保持用户会话。

问题是我的 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 响应的一部分。

4

1 回答 1

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_tokenQueryString 的一部分传递给您,则需要重写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(电子邮件,密码,选项)中的参数,您还可以触发一个事件,例如@trigger('authenticated')从模型中,让视图/应用程序知道用户现在已通过身份验证。

于 2013-02-06T11:42:03.853 回答