Quarkus如何支持校验来自多个不同来源的JWT令牌?
多来源JWT校验的Quarkus最优实现方案
方案1:使用quarkus-oidc多租户能力(推荐)
quarkus-oidc本身支持仅做JWT有效性校验,无需启用完整OIDC流程,且原生支持多租户配置,可以完美适配你的需求:
- 每个JWT来源对应一个独立租户,单独配置签名公钥、issuer校验规则等参数
- 开启租户自动解析后,框架会自动根据JWT的
iss(签发者)字段匹配对应租户的校验规则,无需额外编码
配置示例(application.properties):
# Keycloak租户配置 quarkus.oidc.keycloak.auth-server-url=https://你的keycloak地址/realms/你的realm quarkus.oidc.keycloak.client-id=你的服务客户端ID quarkus.oidc.keycloak.application-type=service quarkus.oidc.keycloak.tenant-enabled=true # 内部服务JWT租户配置 # 此处auth-server-url填内部JWT的iss字段值即可,不需要对应真实的OIDC服务 quarkus.oidc.internal.auth-server-url=your-internal-jwt-issuer quarkus.oidc.internal.application-type=service # 直接配置内部JWT的签名公钥,也可配置jwks-path指向本地JWKS文件 quarkus.oidc.internal.public-key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA... quarkus.oidc.internal.tenant-enabled=true # 开启自动按issuer匹配租户 quarkus.oidc.tenant-resolution.enabled=true
该方案无需修改业务代码,后续新增JWT来源只需要新增对应租户配置即可,是目前最优雅的实现方式。
方案2:基于quarkus-smallrye-jwt自定义校验器
如果你坚持使用quarkus-smallrye-jwt,可以通过自定义JWT校验器实现多来源适配,无需合并所有密钥到同一个JWKS:
- 实现自定义校验类继承默认的
DefaultJsonWebTokenValidator,根据不同issuer加载对应签名公钥做校验:
import io.smallrye.jwt.auth.cdi.DefaultJsonWebTokenValidator; import org.eclipse.microprofile.jwt.JsonWebToken; import javax.enterprise.context.ApplicationScoped; import java.security.PublicKey; import java.util.Map; @ApplicationScoped public class MultiSourceJwtValidator extends DefaultJsonWebTokenValidator { // 预配置各签发者对应的签名公钥 private final Map<String, PublicKey> issuerKeyMapping = Map.of( "https://keycloak地址/realms/你的realm", getKeycloakPublicKey(), "内部JWT签发者", getInternalPublicKey() ); @Override public void validate(JsonWebToken jwt) { String issuer = jwt.getIssuer(); PublicKey verifyKey = issuerKeyMapping.get(issuer); if (verifyKey == null) { throw new SecurityException("非法的令牌签发来源"); } // 校验签名、有效期、受众等基础字段 super.validate(jwt, verifyKey); } // 实现从配置/本地文件读取公钥的逻辑即可 private PublicKey getKeycloakPublicKey() { // 省略实现 } private PublicKey getInternalPublicKey() { // 省略实现 } }
- 在配置文件中指定使用自定义校验器即可生效。
内容的提问来源于stack exchange,提问作者oole
相关产品推荐
相关产品推荐

