1.2. OIDC 请求过滤器
您可以通过注册一个或多个 OidcRequestFilter 实现(可以更新或添加新的请求标头),或分析请求正文,将 OIDC 客户端向 OIDC 供应商发出的 OIDC 请求。
您可以使用单个过滤器截获请求到所有 OIDC 供应商端点,或使用 @OidcEndpoint 注解将此过滤器应用到特定的端点。例如:
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.OidcRequestFilter;
import io.vertx.core.http.HttpMethod;
@ApplicationScoped
@OidcEndpoint(value = Type.TOKEN)
@Unremovable
public class OidcRequestCustomizer implements OidcRequestFilter {
@Override
public void filter(OidcRequestContext requestContext) {
HttpMethod method = requestContext.request().method();
String uri = requestContext.request().uri();
if (method == HttpMethod.POST && uri.endsWith("/token") && requestContext.requestBody() != null) {
requestContext.request().putHeader("Digest", calculateDigest(requestContext.requestBody().toString()));
}
}
private String calculateDigest(String bodyString) {
// Apply the required digest algorithm to the body string
}
}
OidcRequestContextProperties 可用于访问请求属性。目前,您可以使用 client_id 键访问客户端租户 id,以及一个 grant_type 键来访问 OIDC 客户端用来获取令牌的授权类型。