2015-06-21 67 views
0

我正在通過HTTPS在Node.js應用上創建REST服務。我不想讓任何人使用這些REST服務,除非他們是經過身份驗證的用戶,所以在向這些服務提出請求時我需要一種身份驗證方法。Node.js RESTFUL服務自建認證

我在網上看過,看起來OAuth2與護照是一個很好的解決方案...然而,我想出了我認爲是一個更簡單的解決方案,不需要持久性的令牌,我想知道,是否有我的解決方案有任何大的漏洞嗎?

我的解決方案是保持存儲在服務器上的祕密。當用戶登錄並驗證它們(或註冊)時,我散列用戶名,爲其添加時間戳,並用我的密碼對其進行編碼以創建「訪問令牌」。由於時間戳,此令牌將在一小時後(或一天或不管多久...)過期。

一旦用戶擁有此訪問令牌,他們只需將請求查詢中的此令牌及其用戶名一起傳遞,並且他們將能夠使用服務器的REST API。鑑於當我用我的服務器密碼解碼令牌時,它等於用戶名。

此方法也不要求我堅持任何令牌信息(刷新令牌,到期時間等)。我也不需要額外的模塊,如護照和oauth模塊來實現我的解決方案,它看起來非常緊湊。

我的問題是(我對安全性非常陌生),假設服務器的祕密永遠不會被發現,這個解決方案是否足以滿足爲移動應用程序提供服務的服務器的需求(通過REST客戶端仍然可以訪問)?

回答

1

歡迎來到SO!

默認回答任何有關安全的問題:不要試圖自己做:)

這聽起來像你重新發明簽署的訪問令牌方案,這是越來越編纂爲JSON網絡令牌(JWTs)。我強烈建議你改用這個方案。

不要在GET參數中傳遞數據,因爲它很可能會被緩存或記錄在某處(打開自己以適應中間人攻擊)。您應該在HttpOnly; Secure Cookie中存儲令牌,以防止Cookie暴露給非安全渠道。

我已經寫上JWTs以及如何在Web瀏覽器使用它們一些有深度的文章:

Create and Verify JWTs With Node.js

Build Secure User Interfaces Using JSON Web Tokens (JWTs)

聲明:我在Stormpath工作。我們是一個用戶認證服務,我們可以爲您卸載所有這些問題。這聽起來像你使用節點,我們有很棒的庫,可以讓你在幾分鐘內滿足用戶的所有需求:)

我也是nJwt的作者,它是一個Node.js庫,它使它非常容易使用智威湯遜的正確方法。

希望這會有所幫助!

+0

嗨!偉大的迴應,我結束了使用jwt-simple創建令牌並根據我的服務器祕密對此令牌進行解碼!我並不擔心瀏覽器緩存令牌,因爲這些令牌每小時都會過期。另外,我通過HTTPS連接提供所有這些信息(這不會阻止MITM攻擊嗎?) 如果沒有,我肯定會考慮將這些令牌存儲在安全的cookie中(如上所述)。 – user3594827

+0

我對緩存的評論更多的是關於後端服務器緩存或代理緩存。許多系統還記錄URLS(例如監控和分析系統),因此您也可以將令牌暴露給這些系統。 – robertjd