如何在quarkus-oidc校验前将请求体中的OpenID token写入Authorization头
解决方案
核心思路
Quarkus OIDC的校验逻辑确实在Vert.x HTTP层执行,早于JAX-RS的ContainerRequestFilter执行时机,所以你需要在Vert.x路由层实现过滤器,将优先级设置为高于OIDC认证过滤器,即可在校验前完成token提取和请求头写入。
实现步骤
1. 实现Vert.x路由过滤器
使用Quarkus提供的@RouteFilter注解注册全局路由过滤器,设置足够高的优先级(数字越小优先级越高,OIDC默认优先级为1000,设置为10即可确保先执行),参考代码如下:
import io.quarkus.vertx.http.filters.RouteFilter; import io.vertx.core.http.HttpServerRequest; import io.vertx.ext.web.RoutingContext; import io.vertx.core.json.JsonObject; import javax.enterprise.context.ApplicationScoped; @ApplicationScoped public class TokenExtractFilter { @RouteFilter(10) void extractTokenFromBody(RoutingContext rc) { HttpServerRequest request = rc.request(); // 仅对目标legacy接口执行逻辑,避免全量接口无意义开销 if (!"/your-legacy-endpoint".equals(request.path())) { rc.next(); return; } // 读取请求体,Quarkus会自动缓存body,后续JAX-RS端点可正常读取 rc.body().onSuccess(buffer -> { try { JsonObject bodyJson = buffer.toJsonObject(); // 替换为实际请求体中存储access token的字段名 String accessToken = bodyJson.getString("access_token"); if (accessToken != null && !accessToken.isBlank()) { // 写入Authorization请求头,适配OIDC校验规则 request.headers().set("Authorization", "Bearer " + accessToken); } } catch (Exception e) { // 解析失败直接走后续流程,OIDC会自动返回401状态码 } finally { // 继续执行后续逻辑,包括OIDC认证校验 rc.next(); } }).onFailure(err -> rc.next()); } }
2. 适配调整
- 如果你的请求体是form表单格式而非JSON,自行调整解析逻辑提取token字段即可
- 若请求体大小超过默认限制,可配置
quarkus.http.limits.max-body-size参数调整阈值 - 无需关闭proactive authentication,当前过滤器执行优先级足够早,可在OIDC校验前完成头注入
内容的提问来源于stack exchange,提问作者trusteduser
相关产品推荐
相关产品推荐

