You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 实现自定义校验类继承默认的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() {
        // 省略实现
    }
}
  1. 在配置文件中指定使用自定义校验器即可生效。

内容的提问来源于stack exchange,提问作者oole

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:39:01