2015-02-23 154 views
1

我開始了Marionette on Rails應用程序,並且正在尋找一種安全的方式來驗證請求。我敢肯定,這已被許多這樣做,但我無法找到一個滿意的答案:(將Auth令牌安全地存儲在Backbone應用程序中

這是我到目前爲止已經發現:

  • 在軌,我可以生成Devise.friendly_token令牌,將它保存在數據庫中,並將其發送給客戶端。
  • 客戶端可以存儲在從CSRF保護的頁面的元數據標記。
  • 在每個請求,客戶端將發送令牌中標題與

    var token = $("meta[name='csrf-token']").attr("content"); xhr.setRequestHeader("X-CSRF-Token", token);

,服務器會比較令牌驗證請求。到現在爲止還挺好。

  • 我在不同的地方看過,Cookie容易跨域請求。然而,永久性cookies似乎是永久性會話的唯一解決方案。我怎樣才能以安全的方式使用它們?

  • 另一方面,我已經看到,建議在將密碼發送到服務器之前在客戶端散列密碼。對於基於API的服務,這有什麼好處?

謝謝!

+0

查看[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

回答

1

一個解決方案是將授權令牌作爲變量存儲在您的應用程序中。例如,

// 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); 
    }; 
    } 

//... 
}; 

這種方法遠非完美,因爲它允許攻擊者訪問瀏覽器來獲取用戶的訪問令牌。添加額外安全層的一種方法可能是在服務器端的間​​隔之後更新訪問令牌。希望這至少開始一些關於更好的實現方式的討論。

相關問題