在 Open Liberty 中使用和验证 JWT

Consume and validate JWT in Open Liberty

我正在尝试使用 Open Liberty 中的 jwt-1.0 功能。

JwtBuilder API 非常好,允许以编程方式设置过期、签名、加密和构建令牌(以及其他所有需要的东西)。

JwtBuilder.create().expirationTime(expTime).signWith(signAlg, privateKey).encryptWith(keyMgmtAlg, keyMgmtKey, contentEncAlg).buildJwt().compact();

但是 JwtConsuer API 看起来很蹩脚,只允许读取令牌而根本没有验证。

JwtConsumer.create().createJwt(token);

签名验证和解密应通过应用程序服务器配置(通过“jwtConsumer”和“keystore”条目)进行配置,但无法以编程方式进行。 我应该接受这一点,但无法进行其他验证,例如过期日期。

我是不是漏掉了什么?

您是正确的,因为 JwtConsumer API 没有提供编程方式来设置特定的验证要求。然而,当 createJwt() 被调用时,JWT 仍将被验证。

JwtConsumer API 的 create()create(String consumerConfigId) 方法将 JwtConsumer 对象绑定到服务器配置中的 <jwtConsumer> 元素指定验证要求。可以在此处查看该元素的配置设置:https://openliberty.io/docs/22.0.0.4/reference/config/jwtConsumer.html.

JwtConsumer.create() 方法将使用运行时自动提供的默认 <jwtConsumer> 配置,如下所示:

<jwtConsumer id="defaultJwtConsumer" />

同理,JwtConsumer.create(String consumerConfigId)会使用对应ID的配置。因此 JwtConsumer.create("myJwtConsumer") 将使用 server.xml 中相应的“myJwtConsumer”配置。这可能看起来像这样:

<jwtConsumer id="myJwtConsumer"
    issuer="https://example.com"
    audiences="Luke, Leia, Han"
    signatureAlgorithm="RS256"
    jwkEnabled="true"
    jwkEndpointUrl="https://..."
/>

您可以在该配置中放置您想要的任何验证设置。然后,当您调用 JwtConsumer.createJwt(token) 时,运行时将针对 JWT 执行多项验证检查。这包括检查发行者、受众、iatexp 次、nbf 声明,当然还有令牌的签名。

为了扩展答案,如果未指定 clockSkew,则使用默认值 5 分钟。另一方面,设置 clockSkew="0m" 实际上会禁用时钟偏差。