使用JAVA中的JWT保护REST服务ee

时间:2017-06-15 11:30:10

标签: rest security java-ee jwt

我不熟悉网络令牌安全性,我正在尝试实现一个到目前为止没有运气的情况。我已经查看了许多教程和代码示例和项目,但它们要么太高级,只有代码块,要么明确说明此代码是用于学习目的而不是用于生产。

我的要求如下:

我有3个服务需要由多个外部经销商网络应用程序调用 我需要确保从经销商应用程序到我们的应用程序的电话。我们将使用SSL进行通信。

我正在使用带有Java ee的JBOSS EAP7,我计划使用JWT的实现(如jjwt)。

我在网上找到的典型场景是客户端应用程序首先调用一个身份验证服务(我们编写),传递应用程序ID和一个秘密(String)密码以获取JWT令牌。在此之后,应用程序在每次调用3个服务时都会传递此令牌,我们必须在遵循每个请求之前对其进行验证。

我的问题如下:

  1. 当应用程序调用获取令牌时,是否需要传递使用我们提供的公钥加密的请求,否则我们不需要使用SSL? 如果我们需要使用私钥/公钥,是否有一个简单的好示例来说明如何使用Java生成这些密钥以及如何使用它们来加密/解密请求?
  2. 令牌生成。我不确定在发送令牌之前是否需要加密令牌。一些网站谈论使用base64加密,有些讨论用私钥加密签名。我对JWS和JWE概念感到困惑。是否有一个很好的示例或教程可以指导我如何安全地生成令牌?

  3. 在这样的场景中,JWT令牌的典型过期时间是什么,他们是否需要在每次服务调用之前调用并获取新令牌?如果令牌已过期,客户端应用程序是否必须在再次调用之前检查它是否已过期,或者它等待我们的服务返回错误?

  4. 是否有一个简单的示例,说明如何通过请求传递令牌以及如何在服务器上验证它?

  5. 如果可以重复使用,客户端应用程序是否需要将令牌存储在cookie或会话中?

  6. 谢谢

1 个答案:

答案 0 :(得分:1)

  1. 最好使用PKI,因为您可以使用应用程序的公钥来验证请求确实来自受信任的应用程序。
  2. Base64编码用于传递凭证(clientid:secret)以换取(未加密的)JWT
  3. 这取决于您的用例场景,在安全性和可用性之间始终存在权衡。它通常在几分钟到几小时(甚至更长)的范围内,但它肯定必须持续几次调用,至少(以避免由于大量请求导致的瓶颈)。理想情况下,客户也会检查到期时间(原因与之前相同)。
  4. Google是您的朋友,甚至还有libraries
  5. 客户端肯定需要将令牌保存在某处以便能够重用它。