在 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 执行多项验证检查。这包括检查发行者、受众、iat
和 exp
次、nbf
声明,当然还有令牌的签名。
为了扩展答案,如果未指定 clockSkew,则使用默认值 5 分钟。另一方面,设置 clockSkew="0m" 实际上会禁用时钟偏差。
我正在尝试使用 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 执行多项验证检查。这包括检查发行者、受众、iat
和 exp
次、nbf
声明,当然还有令牌的签名。
为了扩展答案,如果未指定 clockSkew,则使用默认值 5 分钟。另一方面,设置 clockSkew="0m" 实际上会禁用时钟偏差。