Quarkus 验证来自多个来源的 JWT

Quarkus verifying JWTs from multiple sources

有没有办法允许来自多个来源的 JWT?

我有一个 REST API,我只允许通过 Bearer Tokens 身份验证访问,我真的只需要验证这些令牌,所以我真的不需要 OIDC 带来的所有附加功能。

假设我将 Keycloak 设置为身份提供者。我会相应地配置 quarkous-oidc。但现在我还想允许我在另一个服务中创建的 JWT,用于服务到服务的通信。这不是身份提供者,但我只是使用 smallrye-jwt 来创建一些“内部”令牌。

所以实际上我似乎更愿意使用 quarkus-smallrye-jwt,但我无法为多个租户配置它。

我认为将密钥合并到 JWKS 中并将其提供给 quarkus-smallrye-jwt 最终会奏效。但也许有一个我没有看到的更优雅的解决方案。

使用 microprofile-jwt(smallrye-jwt),您可以选择使用 JWKS(Json Web Key Set) 作为您的 mp.jwt.verify.publickey.location 属性。这使您可以信任多个发行者发行的代币。 但是,例如,您将无法验证 jwt 令牌的 issuer 字段中的多个值,因为它仅支持单个值,或者为每个发行者定义不同的配置。

您可以手动创建 JWKS,将来自您的身份验证提供商的密钥信息与 embedding/mounting 在您的应用程序中组合起来,或者您可以实现一些动态生成它的端点(例如,它会定期调用 2 Keycloaks JWKS url 并结合输出生成新的 JWKS)

如果您需要对验证进行更多控制,则需要创建自己的实现并将其与 MP JWT/Quarkus 集成。一种选择是为 smallrye-jwt 提供自定义 JWTCallerPrincipalFactory - 请参阅 docs about custom factories。在那里你可以阅读任何自定义配置(例如 my.app.jwt.issuers=trustedIssuer1,trustedIssuer2 并自己处理验证,也许重用 smallrye 已经提供的 类(JWTAuthContextInfoJWTParser...)