2015-02-07 81 views
5

我正在開發一個單頁面,在客戶端使用Javascript + AngularJS,在服務器端使用Spring MVC + Spring Security OAuth2。 Spring MVC充當REST控制器,用於來自頁面的任何AJAX請求。使用OAuth2在Javascript中下載文件

對於授權,腳本會爲每個AJAX請求發送一個「Authorization:Bearer ...」標頭。這在請求少量數據時工作正常。 下載XML文件(用戶數據導出)我通過AJAX下載它們,使用的OAuth2頭和創建BLOB,以便保存在瀏覽器中的文件:

var blob = new Blob([data.data], {'type': "text/xml"}); 
var a = document.createElement("a"); 
a.href = window.URL.createObjectURL(blob); 
a.download = "downloaded-file-" + new Date().toISOString() + ".xml"; 
a.click(); 

這種方法有效,但

  • 使用RAM等不適合大文件下載
  • 沒有顯示正確的進度/加載條

所以,問題是:是否有一個賭注用OAuth2授權下載文件的方式? Javascript不允許在重定向時指定標頭,而且OAuth不允許通過URL參數指定授權標記。我想任

  • 加入了特殊的Spring MVC控制器的方法來提供從URL編碼的令牌重定向到一個頭編碼的HTTP請求
  • 添加額外的春季安全過濾器的URL,以允許提取從URL中的令牌參數
  • 轉移到基於cookie的授權的OAuth2

,而不是如果沒有人有類似的問題,請你分享你的方法解決這個問題?

回答

3

原來它很容易在春季,安全的oauth2 2.0.7.RELEASE向:

只需通過訪問令牌作爲access_token請求參數:

window.open("service/export?access_token=" + access_token); 

現在,這就會出現在下載歷史記錄中以明文形式存取令牌,因此爲了確保安全,應該正確實施「註銷」選項,否則下載操作必須以「表格帖子」的形式完成。

+0

很高興知道這個功能。有一個問題,你認爲「註銷選項應該正確實施」是什麼意思? – dacuna 2015-09-06 04:27:35

+5

該URL將與令牌一起保存在瀏覽器的歷史記錄中。任何有權訪問瀏覽器歷史記錄的人都可以找到該URL並提取access_token值。因此,如果用戶從公共計算機登錄,他需要能夠註銷(銷燬/忘記服務器端的access_token),否則任何人都可以使用他的access_token,直到它過期。Spring不提供「註銷」功能,因此除非令牌短暫存在,否則需要實施一項功能來擦除服務器端的access_token。 – 2015-09-06 12:33:46

+0

Aaam好的,謝謝你的評論! – dacuna 2015-09-06 20:05:02

1

如果我是你的話,我會用餅乾去 - 它需要所有的麻煩。我最近寫了一些博客來展示它是多麼容易(例如https://spring.io/blog/2015/01/20/the-resource-server-angular-js-and-spring-security-part-iii)。人們對「無狀態」應用程序太過擔心。

+1

什麼是你的解決方案,以防止xsrf在這種情況下? – Bon 2015-09-17 20:47:03

+0

Spring Security和Spring Security OAuth都默認使用反xsrf(我們稱之爲「csrf」)度量。如果您有特別的問題,我會提出這個問題作爲一個單獨的問題。 – 2015-09-24 06:57:43

+0

但是,如果cookie來自外部來源,那麼您如何爲xsrf預防提供令牌是我很好奇的。 – Bon 2015-09-24 14:11:50