【问题标题】:How to generate a JWT/JWS with JWE如何使用 JWE 生成 JWT/JWS
【发布时间】:2017-02-09 17:01:38
【问题描述】:

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

I found a decent tutorial from bitbuckets jose4j

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

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

【问题讨论】:

  • 您是想在实现中与 OAuth2.0 / OIDC 兼容,还是只是使用 JWT(带有 JWS 和 JWE)来保持用户会话?
  • @ingenious 我想让用户选择使用 Google 等 OAuth2 提供商登录,但目前主要目标是保持用户会话。

标签: jakarta-ee encryption jwt jwe jwk


【解决方案1】:

首先要做的是 - 去看看这篇关于 authentication with OAuth2.0 的文章。根据您的背景,您可能需要自己阅读 OAuth 和 OpenID Connect。

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

  • 会话何时创建 (iat)
  • 会话仍然有效多长时间(exp)
  • 谁创建了会话,那是您的身份验证系统 (iss)
  • 谁被这个会话认证,那是你的用户 ID 什么的(子)

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

通常最好参考the OIDC core spec 中的建议声明。

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

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

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

还可以查看this article 以获得关于令牌身份验证内容的非常好的概述。

【讨论】:

  • 就在我以为我已经掌握了这整件事的时候。你来了,把它搞砸了,哈哈。谢谢你的信息,这很有帮助。
猜你喜欢
  • 2018-03-27
  • 2016-11-21
  • 2022-10-31
  • 2019-03-16
  • 2020-10-12
  • 2015-11-03
  • 2015-11-09
  • 2018-07-17
  • 2018-04-08
相关资源
最近更新 更多