2015-12-06 34 views
1

最近我一直在研究node.js,REST API和WebSockets以進一步瞭解後端和前端Web開發的知識。嘗試使用最佳實踐,我發現REST API始終處於運行狀態。現在我的問題,我似乎不明白如何妥善解決。安全地分離後端和frotend(node.js服務器)

舉個例子,我想讓客戶機/服務器解耦,爲此我在後端實現了一個REST API,這樣我的前端就可以訪問並獲取數據進行渲染。具體(虛構)例子:可以說我想建立一個出租服務網站。現在我想爲我的前端設置一個端點來訪問某些產品的信息,比如說到目前爲止租用的自行車的數量。我希望能夠在前端顯示(通過REST API的幫助),但我不想讓其他調用此REST API的人能夠獲取數據(因爲間諜活動是一項嚴重的業務我想保留那些邪惡的東西,是的,他們可以網絡爬行,但是我們可以說是bla bla)。因此,本質上我希望localhost機器能夠訪問(部分)REST API,但不能訪問其他任何人。事情變得複雜起來,因爲我也希望人們能夠在我的網站上創建一個用戶,所以我希望有其他終端可以不受限制地訪問,因爲我在想,如果在某個時刻, d喜歡有一個與該服務集成的移動應用程序。那麼限制所有請求到localhost將是不可行的。

你會如何設計一個安全的服務器/客戶端作爲這個?或者你認爲將REST API暴露給其他人(邪惡的)並不是什麼大不了的事情?

以上代碼也適用於WebSockets。我知道REST API都很好,很整潔,但我認爲未來在於接近實時的連接,所以我同樣對WebSockets感興趣(當然,通過更高級別的模塊,Socket.io,SockJS等)。

+0

您的客戶端是否全部公開或受限於登錄機制? –

+0

客戶端將部分公開(考慮網站類型的網站),部分通過身份驗證限制網頁。但問題並不在於此。也許我不清楚,請參閱[我的其他評論](http://stackoverflow.com/questions/34116494/securely-decouple-backend-and-frotend-node-js-server?noredirect=1#comment55986151_34116882) – razvanc

回答

0

有很多解決方案來保護你的API,其中許多是開源的。你將使用哪一個真正取決於你的詳細需求。

但是,讓你開始,我會提到,非常受一個大社區的接受和支持的解決方案:

看一看JSON網絡令牌,其例如在this Article解釋。

基本上,您的客戶端從服務器請求一個身份驗證令牌,然後將其存儲在本地,以便對您的API的每個請求重新使用它。 另一方面,服務器可能會根據需要保護您的API。這意味着您可能也有一個公共API,它不會在HTTP標頭中使用一個標記。

代幣也可能過期。例如,如果您允許新用戶在您的網站上註冊一段時間,那麼這很方便。

Here is another article解釋事情。

現在到你的問題的websocket部分。是的,你肯定也想保護你的服務器端插座。因此,請注意支持身份驗證的庫。再次,我認爲那裏有許多開源庫。

提一個:Primus。 Primus是許多套接字庫的抽象層,可讓您快速更改套接字提供程序。但它也有一個可以實現的認證鉤子。

並猜測你可以用它來檢查JSON Web令牌!

希望這能讓你開始。

+0

感謝您的資源,它對實現用戶登錄過程非常有用,但這只是部分答案。我已經閱讀過關於JWT的文章,這絕對是前進的方向,但我要問的是:*如何構建一個服務器,其中一些REST API端點僅限於來自本地主機(服務器)的調用,併爲註冊用戶提供REST API的其他部分*。你的回答解決了下半場(這已經有很多文檔了)。我期望只有部分API可以通過'localhost'在內部訪問。那可能嗎? – razvanc

+0

或者我可能沒有正確地制定它。所以我的靜態文件將被客戶查看,是嗎?所以當我想從數據庫中加載一些信息的頁面時,我會使用REST API端點。但是有沒有辦法讓這些端點只能通過我的前端訪問?也就是說,如果其他人試圖「捲曲」這些端點,他們會得到404或401或其他東西......不知道這是否可能。想不到限制這些電話的方法。 – razvanc

+0

請考慮一下,超級管理員創建管理員的場景。比方說,管理員登錄和超級管理員從數據庫中刪除此用戶。當他登錄時,他有一個可以提出請求的有效令牌。你如何處理這種情況,你想驗證用戶是否存在? –