一個解決方案是將授權令牌作爲變量存儲在您的應用程序中。例如,
// app.js
var app = {
views: {},
models: {},
collections: {},
routers: {},
utils: {},
adapters: {},
session: {}
};
當用戶登錄時,服務器將發送Devise.friendly_token回客戶端。您可以將該訪問令牌保存在應用程序中,並保護您免受CSRF攻擊。但是,如果攻擊者可以訪問用戶的瀏覽器,則該方法會向您提供其他類型的攻擊。
// LoginView.js
app.views.LoginView = Backbone.View.extend({
// ...
login: function(event){
var data = new FormData();
data.append('email', $('#email').val());
data.append('password', $('#password').val());
$.ajax({
url: API_ROOT + "api/v1/login",
data: data,
type: 'POST',
success: function(data){
app.session.userEmail = data.email;
app.session.userAccessToken = data.access_token;
},
error: function(data){
alert('Login failed');
}
});
},
// ...
});
一旦存儲了令牌,就會將其發送到您的API服務器請求的授權頭中。
Backbone.sync = function(method, model, options) {
// ... override the Backbone.sync function. See the annotated source code for more
// info.
options.beforeSend = function(xhr) {
xhr.setRequestHeader('Authorization', ("" + app.session.userAccessToken));
}
//... also send for POST
if (options.emulateHTTP && (type === 'PUT' || type === 'DELETE' || type === 'PATCH')) {
params.type = 'POST';
if (options.emulateJSON) params.data._method = type;
var beforeSend = options.beforeSend;
options.beforeSend = function(xhr) {
xhr.setRequestHeader('X-HTTP-Method-Override', type);
xhr.setRequestHeader('Authorization', ("" + app.session.userAccessToken));
if (beforeSend) return beforeSend.apply(this, arguments);
};
}
//...
};
這種方法遠非完美,因爲它允許攻擊者訪問瀏覽器來獲取用戶的訪問令牌。添加額外安全層的一種方法可能是在服務器端的間隔之後更新訪問令牌。希望這至少開始一些關於更好的實現方式的討論。
查看[sessionStorage](https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage)和[localStorage](https://developer.mozilla.org/en -US/docs/Web/API/Window/localStorage)用於持久性存儲的API。 – 2015-02-23 22:05:11