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

禁用主动认证后如何在Quarkus中获取并处理JWT

解决方案

1. 手动提取原始JWT令牌

禁用主动认证后,Quarkus不会自动解析Authorization头,需要手动从请求中提取Bearer令牌:

@RequestScoped
public class AccessRights {

    @Inject
    HttpServletRequest request;

    private String extractRawToken() {
        String authHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
        if (authHeader == null || !authHeader.startsWith("Bearer ")) {
            throw new AccessDeniedException("缺失或无效的Authorization请求头");
        }
        // 移除"Bearer "前缀,获取原始JWT字符串
        return authHeader.substring(7);
    }

    // 后续验证逻辑...
}

2. 手动验证JWT并解析Claims

原来主动认证自动处理的JWT有效性校验(签名、过期时间、签发者等),现在需要通过Quarkus提供的JWT工具类手动完成:

import io.smallrye.jwt.util.JwtUtils;
import org.eclipse.microprofile.jwt.JsonWebToken;
import jakarta.json.JsonObject;

// ...

public boolean validateAccess() {
    String rawToken = extractRawToken();

    try {
        // 解析并验证JWT(自动读取application.properties中的配置,如签发者、公钥等)
        JsonWebToken jwt = JwtUtils.parse(rawToken);

        // 可选:自定义额外校验(比如签发者匹配)
        if (!"你的令牌签发者地址".equals(jwt.getIssuer())) {
            throw new AccessDeniedException("令牌签发者无效");
        }

        // 提取自定义Claim
        JsonObject claim = jwt.getClaim("claim");
        // 执行你的权限验证逻辑(比如角色检查、调用外部API获取权限等)

        return true;
    } catch (Exception e) {
        // 捕获JWT验证异常,抛出后会被GraphQL错误处理器转为200响应+JSON错误体
        throw new RuntimeException("JWT令牌无效: " + e.getMessage());
    }
}

如果需要更灵活的校验规则,可以使用JsonWebTokenParser:

import io.smallrye.jwt.JsonWebTokenParser;

// ...

JsonWebTokenParser parser = JsonWebTokenParser.parser()
    .verifySignature(true) // 验证签名
    .verifyIssuer(true)    // 验证签发者(依赖配置的quarkus.smallrye-jwt.verify.issuer)
    .verifyExpiration(true); // 验证过期时间

JsonWebToken jwt = parser.parse(rawToken);

3. 关键配置说明

确保application.properties中保留JWT验证所需的核心配置,比如:

# 令牌签发者
quarkus.smallrye-jwt.verify.issuer=https://你的签发者域名
# 验证签名用的公钥路径或URL
quarkus.smallrye-jwt.public-key.location=META-INF/publicKey.pem

为什么之前的CurrentIdentityAssociation方案无效?

当quarkus.http.auth.proactive=false时,Quarkus不会自动触发认证流程,getDeferredIdentity()返回的是未认证的空身份,这种方案仅适用于需要延迟触发认证的场景,不符合当前手动处理JWT的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:10:44