2016-08-14 93 views
1

我創建與個人項目有水療中心的API,我下面的解決方案之間猶豫來驗證用戶身份(注:通過HTTPS):約JSON網絡令牌安全性和可靠性問題(JWT)

  1. HTTP基本認證(發送用戶名/密碼至極每個請求)
  2. 基於令牌的認證(在數據庫中存儲SHA1-ED用戶令牌)
  3. JSON網絡令牌(JWT)認證

I D甚至不考慮OAuth導致它看起來像一個真正的痛苦,我不需要與其他應用程序進行身份驗證,我只關心認證用戶。

從我讀過的內容來看,JWT似乎是一個不斷增長的標準。它基本上保存了來電者的數據,因此每次他使用您的secret向您發出encrypt(base64(header) + "." + base64(payload))的API請求時,您都會將其與標記本身的最後一部分中提供的簽名進行比較。它避免了必須執行數據庫事務。

問題是,如果我使用JWT 1)我有沒有可能手動吊銷特定的標記,而且大部分都2)如果我改變一個用戶的權限,先前授予JWT仍會有舊數據與他的舊權限可以授予/限制他持續訪問某些數據,只要他沒有獲得具有新權限的新令牌,這實際上是有問題的,我很驚訝我沒有看到任何人提到過這個問題呢。此外,JWT聲稱允許服務器驗證訪問而不訪問數據庫,但我無法想象任何不涉及數據庫的API請求,只是爲了返回用戶請求的數據。所以這個論點對我來說沒有任何意義。

對我而言,我現在最好的選擇是選項2。網站將有限制和小流量,所以在數據庫中存儲令牌似乎是一個小而值得的權衡,並允許我用這些令牌做任何事情,包括管理它們的生命週期和權限。它還可以避免像使用選項1那樣暴露用戶的憑據,以防他們對其他在線服務使用相同的憑據。

我只想知道我對JWT的擔憂是否正確,或者我誤解了它的功能?另外,即使我已經閱讀了很多關於這些不同的選項的內容,也可以隨意鏈接任何可能讓我喜歡的東西,並幫助我做出更好的選擇。謝謝。

回答

1

你是對的,失效令牌在到期之前是一個常見的JWT問題。有幾個理由需要考慮:帳戶被刪除/阻止/暫停,密碼被更改,權限被更改,用戶通過管理員註銷。

智威湯遜,您還可以設置令牌黑名單,以存儲註銷之間&到期時間的標記,標記過期,檢查它的每一個要求。當用戶更改其密碼/權限被簽署令牌的哈希可以只包括ID(JWT的jti要求),或者使用上次登錄的日期和iat要求(在發行)

其他技術無效令牌那些領域。如果字段值更改,則以前的任何令牌都將自動無法驗證。

https://stackoverflow.com/a/37520125/6371459

最後,要注意的是,令牌與服務器的私有密鑰(未加密)

sign(base64(header) + "." + base64(payload)) 
+0

與用戶配置文件字段的哈希簽名簽署聽起來像一個好主意和解決問題** 2)**。感謝您的解釋。 – Flawyte

+0

關於*令牌黑名單*,我認爲如果你打算在dabatase上存儲任何東西,然後存儲生成的令牌,因爲它可以讓你更好地控制它們(並且如果你沒有把它保存在某個地方,你就不能將以前生成的令牌黑名單無論如何在世代時間)。 – Flawyte

+1

如果您不希望過多的令牌被吊銷,您也可以使用內存中的黑名單。您只需在更新用戶和'currentTime - maxExpiryTime lastModified'(不發送更多未過期的令牌)時,該條目可以被丟棄。在這種情況下,你不需要存儲整個令牌。只是'sub','iat'或者'jti' – pedrofb