首页 > 解决方案 > Quarkus SmallRye-JWT JSON Web 密钥集刷新间隔

问题描述

我正在使用 SmallRye JWT 生成和验证 JWT 令牌。
使用微服务 A,我生成 JWT 令牌。
使用微服务 B,我必须验证 JWT 令牌。
在微服务 B 中,我使用以下属性:

smallrye:
  jwt:
    verify:
      key:
        location: http://localhost:8084/key
    jwks:
      refresh-interval: 2
      forced-refresh-interval: 2
  token:
    kid: 123452

微服务 A 具有生成 JWKS 的端点 /key:

{
  "keys": [
    {
      "kty": "RSA",
      "kid": "123452",
      "n": "i7y5smIoGrMHAQnwef7DfhSsrm-locPO_I1LkKHHVb4ol_Tfu3Me5uswb7M92H_A1Mhub4Zsugy22OqKVNnX9Z9UDpu4yG-KfPJRNNI9Rzo0fIBHzf8_g_cIdiNJJbODndxVAr4I38ZcFV6rSw",
      "e": "AQAB"
    }
  ]
}

当我同时运行两个微服务时,我可以验证微服务 B 中的令牌......但是如果我重新启动微服务 A(它将生成另一个 JWKS),但微服务 B 将无法再验证 JWT 令牌。在 SmallRye - Quarkus 文档中,我发现了以下属性:

smallrye.jwt.jwks.refresh-interval:JWK 缓存刷新间隔,以分钟为单位。除非 mp.jwt.verify.publickey.location 指向基于 HTTP 或 HTTPS URL 的 JWK 集,并且没有从 JWK 集端点返回具有正 max-age 参数值的 HTTP Cache-Control 响应标头,否则它将被忽略。

smallrye.jwt.jwks.forced-refresh-interval:以分钟为单位的强制 JWK 缓存刷新间隔,用于限制由于缓存没有 JWK 密钥而导致令牌验证失败时可能发生的强制刷新尝试的频率与孩子与当前令牌的孩子标头匹配的属性。除非 mp.jwt.verify.publickey.location 指向基于 HTTP 或 HTTPS URL 的 JWK 集,否则它将被忽略。

如您所见,我将两个属性都设置为 2 分钟:

smallrye:
  jwt:
    verify:
      key:
        location: http://localhost:8084/key
    jwks:
      refresh-interval: 2
      forced-refresh-interval: 2
  token:
    kid: 123452

但它不起作用。

我该怎么做才能使它起作用?我想再次调用 key.location (http://localhost:8084/key) 来再次阅读新的 JKWS。

谢谢你。

标签: javajwtquarkussmallryequarkus-oidc

解决方案


推荐阅读