2017-10-04 62 views
0

在過去的幾個月中,我一直在爲我工作的公司開發一個Web應用程序的Rest API。端點提供數據,如交易歷史記錄,用戶數據和支持票數據。但是,我一直在遇到一個似乎總讓我回到某種程度的問題。如何安全地處理Rest API用戶認證?

我似乎不斷遇到的問題是如何安全地處理Rest API的用戶認證?所有的數據都將通過SSL連接發送,但是我的一部分對於可能出現的潛在安全問題有點偏執。目前,當客戶端嘗試登錄時,客戶端必須提供用戶名或電子郵件地址以及登錄端點(E.G「/ api/login」)的密碼。伴隨着這些信息,必須通過發送登錄憑證的請求頭來提供瀏覽器指紋。 API然後驗證指定的用戶是否存在,檢查提供的密碼是否正確,並將指紋存儲在數據庫模型中。要訪問API中的任何其他端點,需要使用登錄時的有效令牌和有效的瀏覽器指紋。

我一直在使用瀏覽器指紋作爲防止令牌劫持的手段,並且作爲一種方式確保用於登錄的設備被用於發出請求。但是,我注意到這種做法讓我反感的情景。我用來生成瀏覽器指紋的客戶端庫並不總是準確的。有時圖書館會完全吐出不同的指紋。這會導致某些客戶端請求失敗,因爲API不能將其識別爲有效。我想跟蹤哪些設備用於向API發出請求。是否有更一致的方式來保護令牌不被劫持?

當想到上一個問題時,還會想到另一個問題。如何安全地在客戶端存儲身份驗證令牌,或者以某種方式使某人難以通過惡意方式(如xss攻擊)獲取令牌?我知道在基於瀏覽器的客戶端上設置嚴格的內容安全策略可以有效防禦xss攻擊。但是,我仍然對將代幣存儲爲Cookie或存儲在本地存在偏執。

我知道oauth2通常是一個很好的解決方案,用戶認證,我曾考慮過使用它來處理這個問題。雖然,我正在使用Flask編寫API,並且我還使用JSON Web令牌。就目前而言,當使用oauth進行身份驗證時,Flask的oauth2實現無法使用JWT作爲訪問令牌。

這是我的第一個大型項目,我不得不處理這個問題,我不知道該怎麼做。任何幫助,建議,或批評都表示讚賞。我現在需要幫助。

回答

0

將API網關置於您的API之前,您的API網關公開(即在DMZ中),而實際的API是內部公開的。你可以看看Kong ..