禁用主动认证后如何在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
相关产品推荐
相关产品推荐

