在JavaEE中使用JWT保护REST服务

在JavaEE中使用JWT保护REST服务,rest,security,jakarta-ee,jwt,Rest,Security,Jakarta Ee,Jwt,我不熟悉web令牌安全性,我正在尝试实现一个到目前为止运气不佳的场景。我看过很多教程、代码示例和项目,但它们要么太高级,要么只是代码块,要么明确指出这些代码是用于学习目的,而不是用于生产 我的要求如下: 我有3项服务需要多个外部经销商web应用程序调用。 我需要确保从经销商应用程序到我们应用程序的通话安全。我们将使用SSL进行通信 我将JBOSS EAP7与JavaEE一起使用,我计划使用JWT的一个实现(如jjwt) 我在网上发现的典型场景是,客户端应用程序首先调用(我们编写的)身份验证服务,

我不熟悉web令牌安全性,我正在尝试实现一个到目前为止运气不佳的场景。我看过很多教程、代码示例和项目,但它们要么太高级,要么只是代码块,要么明确指出这些代码是用于学习目的,而不是用于生产

我的要求如下:

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

我将JBOSS EAP7与JavaEE一起使用,我计划使用JWT的一个实现(如jjwt)

我在网上发现的典型场景是,客户端应用程序首先调用(我们编写的)身份验证服务,传递应用程序Id和机密(字符串)密码以获得JWT令牌。在此之后,应用程序将在每次调用中向3个服务传递此令牌,我们必须在满足每个请求之前对其进行验证

我的问题如下:

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

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

  • 是否有一个简单的示例显示如何通过请求传递令牌,以及如何在服务器上验证令牌

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

  • 多谢各位

  • 使用PKI更可取,因为您可以使用应用程序的公钥来验证请求是否确实来自受信任的应用程序
  • Base64编码用于传递凭据(
    clientid:secret
    ),以交换(未加密的)JWT
  • 这取决于您的用例场景,在安全性和可用性之间始终存在权衡。它通常在几分钟到几小时(甚至更多)之间,但它肯定至少要持续几次呼叫(以避免由于大量请求而出现瓶颈)。理想情况下,客户机还将检查到期日(与前面介绍的原因相同)
  • 谷歌是你的朋友,甚至有专门的
  • 客户端肯定需要将令牌保存在某个地方,以便能够重用它