2

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

我从 bitbuckets jose4j 找到了一个不错的教程

此示例显示他们使用 EllipticCurveJsonWebKey 生成 JWK。我不明白如何将其用于身份验证/授权。您不需要将密钥存储在属性文件或 JNDI 条目中,然后使用该密钥对 JWT 进行签名/加密吗?这样,当我收到一个 http 请求时,我可以使用相同的密钥来验证 JWT。我发现的大多数教程都使用了类似的示例。

这怎么能用相同的服务器端密钥来完成呢?

4

1 回答 1

2

首先要做的事情是查看这篇关于使用 OAuth2.0 进行身份验证的文章。根据您的背景,您可能需要自己阅读 OAuth 和 OpenID Connect。

但是,如果您只想将服务器端会话保持在签名和加密的 JWT 中,那也没关系。在您的 JWT 中,您将需要一些声明,至少有一些声明:

  • 会话何时创建 (iat)
  • 会话仍然有效多长时间(exp)
  • 谁创建了会话,那是您的身份验证系统 (iss)
  • 谁通过此会话进行身份验证,即您的用户 ID 或其他东西(子)

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

参考OIDC 核心规范中建议的声明通常是一个好主意。

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

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

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

另请查看这篇文章,以获得关于令牌身份验证内容的非常好的概述。

于 2016-10-01T05:12:39.097 回答