Quarkus 验证来自多个来源的 JWT
Posted
技术标签:
【中文标题】Quarkus 验证来自多个来源的 JWT【英文标题】:Quarkus verifying JWTs from multiple sources 【发布时间】:2021-10-25 10:16:04 【问题描述】:有没有办法允许来自多个来源的 JWT?
我有一个 REST API,我只允许通过 Bearer Tokens 身份验证访问,而且我真的只需要验证这些令牌,所以我真的不需要 OIDC 带来的所有附加功能。
假设我将 Keycloak 设置为身份提供者。我会相应地配置 quarkous-oidc。但现在我也想允许我在另一个服务中创建的 JWT,用于服务到服务的通信。这不是身份提供者,但我只是使用 smallrye-jwt 创建一些“内部”令牌。
所以实际上我似乎更愿意使用 quarkus-smallrye-jwt,但我无法为多个租户配置它。
我认为整合 JWKS 中的密钥并将其提供给 quarkus-smallrye-jwt 最终会奏效。但也许有一个我没有看到的更优雅的解决方案。
【问题讨论】:
【参考方案1】:使用 microprofile-jwt(smallrye-jwt),您可以选择使用 JWKS(Json Web Key Set) 作为您的 mp.jwt.verify.publickey.location
属性。这使您可以信任由多个发行人发行的代币。
但是,您将无法验证 jwt 令牌的 issuer
字段中的多个值,因为它只支持单个值,或者为每个颁发者定义不同的配置。
您可以手动创建 JWKS,结合来自您的身份验证提供程序的密钥信息并将其嵌入/安装到您的应用程序中,或者您可以实现一些动态生成它的端点(例如,它会定期调用 2 个 Keycloaks JWKS url 并组合产生新 JWKS 的输出)
如果您需要对验证进行更多控制,则需要创建自己的实现并将其与 MP JWT/Quarkus 集成。一种选择是为 smallrye-jwt 提供自定义 JWTCallerPrincipalFactory
- 请参阅 docs about custom factories。在那里你可以读取任何自定义配置(例如my.app.jwt.issuers=trustedIssuer1,trustedIssuer2
并自己处理验证,也许可以重用 smallrye 已经提供的类(JWTAuthContextInfo
、JWTParser
...)
【讨论】:
感谢您的回答!与此同时,我实际上已经尝试了两种方式。由于颁发者验证,第一个组合 JWKS 实际上不起作用。但是我在 JWTCallerPrincipalFactory 的自定义实现方面取得了成功。这样我使用默认解析器,配置从默认配置中获取。然后,我从我的自定义配置中创建另一个 JWTAuthContextInfo,用于我的自定义解析器,以验证我的“内部”JWT。 该属性是否也允许包含多个证书的 PEM 文件?以上是关于Quarkus 验证来自多个来源的 JWT的主要内容,如果未能解决你的问题,请参考以下文章