javascript - 在 Backbone JS 中保持跨页面重新加载 session

标签 javascript rest backbone.js session-cookies

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

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

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

问题是我的 API 不返回 session cookie 又名 auth_token cookie(它只是在响应 json 中返回 auth_token,需要在查询字符串中的所有后续调用中传递该 auth_token)

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

我一直在引用

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

最佳答案

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

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

假设您正在使用 jquery-cookie ( https://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)

顺便说一句,您还可以触发一个事件,例如 @trigger('authenticated'),而不是在 @login(email, password, options) 中使用 option 参数 来自模型,让 View /应用程序知道用户现在已通过身份验证。

关于javascript - 在 Backbone JS 中保持跨页面重新加载 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14710837/

相关文章:

rest - API 开发 : When to return a BAD REQUEST HTTP Status Code (REST)

javascript - 编写一个 backbone.js View 方法,自动向下滚动带有 CSS 溢出的 DOM 元素

javascript - 在 jQuery UI (MultipleDates) 中向日历日添加一个类

javascript - 使用 array.push 进行正确编码

javascript - 如何在 typescript 定义中指定松散类型的对象文字?

javascript - 用于 backbone.js 验证的自定义验证器

rest - 让 React + Backbone 应用程序在没有集合的情况下保持安静

javascript - jQuery 代码仅在添加了alert() 后才有效

java - 使用 requests Restful 客户端时出现阿拉伯编码错误

rest - Mirth 在一个端口上连接多个 HTTP 监听器 channel ?