首页 > 解决方案 > 正文中发送的 OpenID 访问令牌,放在标头中

问题描述

我有一个遗留的 jax-rs 请求。我无法改变它。它的主体具有 OpenID 访问令牌。我想使用 quarkus-oidc 对其进行验证。我的想法是阅读正文并将令牌放入Authorization标题。

我尝试使用ContainerRequestFilter和不使用quarkus 主动身份验证,但看起来 quarkus 身份验证检查发生在 jax-rs 之前,在 vert.x 的某个地方

我找到了这个Quarkus 自定义授权拦截器,但它仅在访问令牌位于查询字符串中时才有效。

如何在 quarkus-oidc 检查访问令牌之前读取请求正文并在标头中写入访问令牌?

标签: vert.xquarkusquarkus-oidc

解决方案


我解决了!不确定这是否是做我想做的最正确的方法,但看起来它工作可靠。

import io.quarkus.vertx.web.RouteFilter;
import io.vertx.core.http.HttpMethod;
import io.vertx.ext.web.RoutingContext;
import io.vertx.ext.web.handler.BodyHandler;

public class JoinServerRequestSecurityRouterFilter {
    @RouteFilter(3000)
    public void extractBody(RoutingContext context) {
        if (context.request().method() != HttpMethod.POST) {
            context.next();
            return;
        }

        if (!"/session-service/join".equals(context.normalizedPath())) {
            context.next();
            return;
        }
        BodyHandler bodyHandler = BodyHandler.create(false);
        bodyHandler.handle(context);
    }
    @RouteFilter(3000 - 1)
    public void copyAccessToken(RoutingContext context) {
        if (context.request().method() != HttpMethod.POST) {
            context.next();
            return;
        }

        if (!"/session-service/join".equals(context.normalizedPath())) {
            context.next();
            return;
        }

        if (context.getBodyAsJson() == null) {
            context.next();
            return;
        }
        String accessToken = context.getBodyAsJson().getString("accessToken");
        context.request().headers().add("Authorization", "Bearer " + accessToken);
        context.next();
    }
}

推荐阅读