如何使用JWE生成JWT / JWS

时间:2016-10-01 04:21:20

标签: java-ee encryption jwt jwe jwk

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

I found a decent tutorial from bitbuckets jose4j

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

稍后您可以添加受众群体,最好是随机数。但是,如果您正在加密所有内容,您可能会在没有nonce的情况下使用它。

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

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

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

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

同时检查this article以获得有关令牌身份验证内容的非常好的概述。