如何使用 JWE 生成 JWT/JWS

How to generate a JWT/JWS with JWE

我正在开发一个j2ee authentication/authorization系统。我想使用 JWT 令牌,使用 JWS 对有效负载进行签名并使用 JWE 对其进行加密。

I found a decent tutorial from bitbuckets jose4j

此示例展示了他们使用 EllipticCurveJsonWebKey 生成 JWK。我不明白这如何用于 authentication/authorization。您是否不需要将密钥存储在属性文件或 JNDI 条目中,然后将该密钥用于 sign/encrypt JWT?这样,当我收到一个 http 请求时,我可以使用相同的密钥来验证 JWT。我发现的大多数教程都使用了类似的示例。

如何使用相同的服务器端密钥完成此操作?

要事第一 - 请查看这篇关于 authentication with OAuth2.0 的文章。根据您的背景,您可能需要自己阅读 OAuth 和 OpenID Connect。

但是,如果您只想将服务器端会话保存在经过签名和加密的 JWT 中,也可以。在您的 JWT 中,您将需要一些声明,至少有一些声明:

  • 会话创建时间 (iat)
  • 会话还有多长时间有效 (exp)
  • 谁创建了会话,这就是您的身份验证系统 (iss)
  • 谁通过了这个会话的认证,那就是你的用户id或者什么的(sub)

稍后您可以添加观众,最好是随机数。但是,如果您要加密所有内容,您也可以在没有随机数的情况下继续使用它。

参考 the OIDC core spec 中建议的声明通常是个好主意。

这就是它变得棘手的地方。你基本上有两个选择——你可以在服务器端生成一个字符串,它对所有应用程序都是完全不透明的,并成为会话。然后提供一个令牌内省端点,客户端可以将此字符串发送到并检索上述声明(加上您决定映射到会话的所有其他声明)。这也意味着您将需要一些存储空间来保存这些不透明的字符串以及它们映射到的用户声明。

或者,您可以只对整个文件签名(并可选择加密)并通过网络发送。只有当您需要能够注销用户时,您才需要一个令牌 ID。对令牌进行签名是使用私钥完成的,只有您的应用程序知道该私钥,并且在任何客户端中的验证都是通过 public 密钥完成的,您的应用程序可以共享该密钥,例如通过提供 JWKs 端点。

根据您在 JWT 中提出的声明,您可能根本不需要加密它......但是,如果您这样做,那么是的,您还必须管理加密密钥。

另请查看 this article 以获得关于令牌身份验证中什么是什么的非常好的概述。