根据您所描述的,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 端点的期望。
如果遵循这是您的最终目标,您可以做几件事:
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')
从模型中,让视图/应用程序知道用户现在已通过身份验证。