2014-09-03 108 views
0

通常使用包含祕密令牌的授權頭向Web服務進行身份驗證。而且由於這個機制的安全性取決於令牌是祕密應該注意這個令牌不會泄露。如何使用angularJs安全設置授權標頭?

Web上有無數的教程解釋瞭如何使用角度設置授權頭,並且至少實際讀取的使用$ http攔截器,現在討論令牌不會泄漏。

有一些公開的和一些私人的API可以通過CORS跨域交談。顯然,我不想在任何這些請求上發送內部授權令牌。

一些其他的技術浮現在腦海中,例如只在每個請求上手動設置標記,但這意味着大量重複的代碼。 $ http服務器可以被包裝在一個$ authenticatedHttp服務中,以便它始終可以從所使用的對象中顯示,無論它是經過身份驗證的服務還是普通的服務。然而,$ http服務有很多方法需要打包。

有沒有更好的解決方案?

UPDATE

從我的印象中,我的問題是不被理解的答案。我嘗試一個更具體的例子:

我有一個私人的網頁。人們必須使用用戶名/密碼登錄,並且爲了簡單起見,我們使用HTTP基本身份驗證,因此用戶名/密碼是bas64編碼的,並且在HTTP標頭「授權」中的每個請求上傳輸。到目前爲止沒有問題。

但有這個偉大的&免費天氣部件。我可以從https://myWhateverWeatherService.tld/weather.json獲取JSON格式的當前天氣信息。登錄到我的私人網絡服務後,我也檢索天氣信息(CORS允許我這樣做)。

問題是,即使myWhateverWeatherService.tld根本不需要任何認證,angular的$ http服務仍然會追加授權標頭。我不相信我的WhateverWeatherService.tld中的傢伙。也許他們只是建立服務,以便他們可以竊取授權令牌,並與他們一起做很多討厭的東西。

我需要一些可靠的方法來解決這個問題。我已經想過在攔截器中用一些正則表達式來檢查url。這是可能的,但也不難忘記我的正則表達式會錯過的特定情況。

回答

0

令牌總是通過電線發送,我想這是最脆弱的部分。

由於令牌必須始終存在於http頭本身上,因此使請求更安全的唯一方法是加密整個請求,並且爲此您應該使用SSL。

如果您擔心在客戶端計算機上存儲令牌的安全性,您可以將其保存在瀏覽器的內存中,而不必將其保存在本地存儲或類似的東西上。因此,每當用戶關閉瀏覽器並再次打開瀏覽器時,他/她必須登錄。

+0

「通過電話發送」的答案是SSL,這很容易。我想你誤解了我的問題。請求頭並不總是需要存在。它不應該出現在某些不受我控制的第三方服務器的請求中。 – yankee 2014-09-03 21:55:54

+0

你是對的,我完全錯過了那部分。在這種情況下,避免將令牌發送給第三方的唯一方法是分開這些呼叫。如果它們比你自己的調用少,我建議你構建一個包裝器,用基本方法去除頭部,而不是檢查每一個請求。因此,爲了縮短這些事情,請使用帶有攔截器的$ http作爲您自己的可信端點,然後使用不帶auth標頭的包裝器。 – Fedaykin 2014-09-04 00:11:36