1.3. OIDC 响应过滤器


您可以通过注册一个或多个 OidcResponseFilter 实现来过滤对 OIDC 客户端请求的响应,该实现可以检查响应状态、标头和正文,以记录它们或执行其他操作。

您可以有一个过滤器,截获对所有 OIDC 客户端请求的响应,或使用 @OidcEndpoint 注解将此过滤器应用到仅针对特定 OIDC 客户端请求的响应。例如:

package io.quarkus.it.keycloak;

import jakarta.enterprise.context.ApplicationScoped;

import org.jboss.logging.Logger;

import io.quarkus.arc.Unremovable;
import io.quarkus.oidc.common.OidcEndpoint;
import io.quarkus.oidc.common.OidcEndpoint.Type;
import io.quarkus.oidc.common.OidcResponseFilter;
import io.quarkus.oidc.common.runtime.OidcConstants;

@ApplicationScoped
@Unremovable
@OidcEndpoint(value = Type.TOKEN) 
1

public class TokenEndpointResponseFilter implements OidcResponseFilter {
    private static final Logger LOG = Logger.getLogger(TokenEndpointResponseFilter.class);

    @Override
    public void filter(OidcResponseContext rc) {
        String contentType = rc.responseHeaders().get("Content-Type"); 
2

        if (contentType.equals("application/json")
                && "refresh_token".equals(rc.requestProperties().get(OidcConstants.GRANT_TYPE)) 
3

                && rc.responseBody().toJsonObject().containsKey("refresh_token")) { 
4

            LOG.debug("Tokens have been refreshed");
        }
    }

}
Copy to Clipboard Toggle word wrap
1
将这个过滤器限制为只针对 OIDC 令牌端点的请求。
2
检查响应 Content-Type 标头。
3
使用 OidcRequestContextProperties 请求属性确认它是 refresh_grant 令牌授权响应。
4
确认响应 JSON 包含 refresh_token 属性。

OidcResponseFilter 可以通过准备 io.vertx.mutiny.core.buffer.Buffer 的实例来自定义响应正文,并将其设置为响应上下文的属性,例如:

package io.quarkus.it.keycloak;

import jakarta.enterprise.context.ApplicationScoped;

import io.quarkus.arc.Unremovable;
import io.quarkus.oidc.common.OidcEndpoint;
import io.quarkus.oidc.common.OidcEndpoint.Type;
import io.quarkus.oidc.common.OidcRequestContextProperties;
import io.quarkus.oidc.common.OidcResponseFilter;
import io.vertx.core.json.JsonObject;
import io.vertx.mutiny.core.buffer.Buffer;

@ApplicationScoped
@Unremovable
@OidcEndpoint(value = Type.TOKEN)
public class TokenResponseFilter implements OidcResponseFilter {

    @Override
    public void filter(OidcResponseContext rc) {
        JsonObject body = rc.responseBody().toJsonObject();
        // JSON `scope` property has multiple values separated by a comma character.
        // It must be replaced with a space character.
        String scope = body.getString("scope");
        body.put("scope", scope.replace(",", " "));
        rc.responseBody(Buffer.buffer(body.toString()));
    }
}
Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat