我正在使用一个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响应的一部分。
答案 0 :(得分:4)
根据您的描述,将auth_token
存储在浏览器的会话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)
作为旁注,不是在@login(电子邮件,密码,选项)中使用option
参数,而是还可以从模型中触发事件,例如@trigger('authenticated')
,让View /应用程序知道用户现在已通过身份验证。