2016-02-27 90 views
4

在服務器上驗證令牌的正確方法是什麼?服務器上的JWT登錄流和令牌驗證

我用我的應用程序JWT令牌機制和這裏的如何了其作爲現在工作:

  1. 客戶端登錄用戶名和密碼
  2. Server檢查用戶名和密碼,並與RSA 創建令牌公鑰和私鑰,並向客戶端發送一個新的令牌,其中包含用戶電子郵件地址的有效負載 ,然後在 數據庫中存儲相同的令牌。
  3. 任何後續的服務器,客戶端上的資源請求沿着 jwt令牌發送服務器然後根據用戶使用登錄的電子郵件地址檢查具有 數據庫中可用令牌的令牌。
  4. 然後提供資源給客戶端。

我想我在這裏失去了一些東西。閱讀其他博客帖子,我發現應該使用密鑰驗證令牌。

幾個問題,我有:

  1. 我不知道是否令牌應該對公共密鑰或 私人檢查關鍵
  2. 當發送JWT令牌的客戶我必須公鑰發送給 客戶端在有效載荷中,因爲我使用的是RSA機制?因此,對於資源的每個請求 ,我必須解碼令牌並檢查公鑰 對私鑰?
  3. 在哪些場景中,我需要將令牌存儲在數據庫中?或者根本不需要在數據庫中存儲令牌 ?
  4. 當惡意獲取客戶端上的令牌 並將其用於登錄時會發生什麼?

注意:我使用的是前端的後端和angularjs的vanilla java和jax-rs(rest)。謝謝

回答

0
  1. 服務器必須使用私鑰在JWT上簽名。然後客戶端可以在收到令牌時使用公鑰和服務器自身進行驗證。
  2. 發送令牌之前,客戶端必須知道公鑰。
  3. 由於JWT已簽名,您不需要將訪問令牌存儲在數據庫中。你可以用簽名來驗證它。如果令牌是使用任何其他私鑰生成的,則不能使用您的公鑰進行驗證。
  4. 攻擊者不應該能夠使用訪問令牌登錄。如果存在惡意獲取令牌的風險,則必須爲該令牌設置一個短期到期期限,並使用refresh token來獲取新令牌。刷新令牌應該保留在服務器端。如果刷新令牌被破壞,它可以失效(用戶應該能夠撤消對該客戶端的訪問)。或者,您可以向JWT注入一個安全的隨機數字,並將該數字存儲在服​​務器端,以對用戶進行處理。當用戶發送令牌時,您必須根據數據庫中的驗證JWT中的安全隨機數。然後,您可以通過更改數據庫中的安全隨機數來使標記無效。