2017-06-15 73 views
0

我對Web令牌安全性並不熟悉,我試圖實現一個目前無法運行的場景。我已經看過很多教程和代碼示例和項目,但它們要麼太高級,只有大量的代碼,或者明確聲明此代碼僅用於學習目的,並非用於生產。使用JWT在JAVA中保護REST服務ee

我的要求如下:

我有3個服務需要由多個外部的經銷商網絡應用程序調用。
我需要確保從經銷商應用程序的電話到我們的應用程序。我們將使用SSL進行通信。

我正在使用JBOSS EAP7和Java EE,我打算使用JWT的實現(如jjwt)。

從我在網上找到的典型場景是,客戶端應用程序首先調用身份驗證服務(我們編寫)傳遞應用程序標識和祕密(字符串)密碼以獲取JWT令牌。在此之後,應用程序會在每次調用這3個服務時傳遞該令牌,並且我們必須在遵守每個請求之前對其進行驗證。

我的問題有以下幾點:

  1. 當應用程序調用獲得令牌,它需要通過這一要求與我們提供或沒有必要,因爲我們使用SSL的公共密鑰加密? 如果我們需要使用私鑰/公鑰,有沒有一個簡單的例子來說明如何使用Java生成這些私鑰,以及如何使用它們來加密/解密請求?
  2. 令牌生成。我不確定在發送它之前是否需要加密令牌本身。一些網站談論使用base64加密,並且一些人談論用私鑰加密簽名。我對JWS和JWE的概念感到困惑。有沒有一個很好的例子或教程可以指導我如何安全地生成令牌?

  3. 在這樣的情況下,JWT令牌的典型到期時間是什麼?他們是否需要在每次服務調用之前調用並獲取新令牌?如果令牌已過期,那麼客戶端應用程序在再次調用之前是否必須檢查它是否過期,或者等到我們的服務返回錯誤?

  4. 有沒有一個簡單的例子,說明如何傳遞一個請求令牌以及如何在服務器上驗證它?

  5. 客戶端應用程序是否需要將令牌存儲在Cookie或會話中,如果它可以重用?

謝謝

回答

0
  1. 使用PKI是最好的,因爲你可以使用該應用的公鑰來驗證請求確實來自受信任的應用來。
  2. Base64編碼被用於交換傳遞憑據(clientid:secret)的(未加密),智威湯遜
  3. 這取決於你的用例場景,總是有安全性和可用性之間的權衡。它通常從幾分鐘到幾小時(或甚至更長),但它肯定要持續幾次呼叫,至少(爲了避免由於大量請求造成的瓶頸)。理想情況下,客戶也會檢查到期日(出於前面提到的相同原因)。
  4. 谷歌是你的朋友,甚至有專用的libraries
  5. 客戶端肯定需要將令牌保存在某處以便能夠重用它。