You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Quarkus OIDC-Client处理Authorization: Basic认证头?

解决方案:Quarkus同时支持Bearer与Basic认证对接Keycloak

核心结论

不用自定义HttpAuthenticationMechanism,Quarkus内置了组合认证机制,能同时处理Bearer令牌验证,以及将Basic认证头自动转成password授权类型向Keycloak请求Bearer令牌的流程。

配置调整(application.properties)

你当前的配置需要做两处关键修改,来激活组合认证逻辑:

# 启用组合认证机制,同时支持OIDC(Bearer)、Basic两种认证方式
quarkus.http.auth.mechanism=oidc,basic
quarkus.http.auth.basic=true

# 权限规则保持原有配置
quarkus.http.auth.permission.basic-bearer.paths=/api/config/*
quarkus.http.auth.permission.basic-bearer.policy=authenticated

# OIDC Bearer认证配置(保留你当前正常运行的配置)
quarkus.oidc.enabled=true
quarkus.oidc.auth-server-url=${keycloakAuthServerUrl}/realms/${keycloakRealm}
quarkus.oidc.discovery-enabled=true
quarkus.oidc.client-id=${keycloakResource}
quarkus.oidc.credentials.secret=${keycloakCredentialsSecret}

# OIDC Client配置,用于处理Basic认证转password grant
quarkus.oidc-client.enabled=true
quarkus.oidc-client.auth-server-url=${keycloakAuthServerUrl}/realms/${keycloakRealm}
quarkus.oidc-client.discovery-enabled=true
quarkus.oidc-client.client-id=${keycloakResource}
quarkus.oidc-client.credentials.secret=${keycloakCredentialsSecret}
# 无需硬编码grant.type=password,Quarkus会在检测到Basic头时自动触发password授权流程

代码调整(ConfigController)

  1. 建议注入SecurityIdentity而非Tokens,它能直接获取认证后的用户信息及令牌上下文
  2. 复用Quarkus内置的ObjectMapper,避免手动创建实例

修改后的Controller代码:

@Path("/api/config")
public class ConfigController {
    @Inject
    SecurityIdentity securityIdentity;
    
    @Inject
    ObjectMapper objectMapper; // 注入Quarkus自动配置的ObjectMapper

    @GET
    @Path("")
    @Produces(MediaType.APPLICATION_JSON)
    public Response sendOk() throws JsonProcessingException {
        // 从SecurityIdentity获取用户标识或令牌信息
        String accessToken = ((JsonWebToken) securityIdentity.getPrincipal()).getToken();
        return Response.ok(objectMapper.writeValueAsString(Map.of("success", accessToken))).build();
    }

    @GET
    @Path("/owners")
    @Produces(MediaType.APPLICATION_JSON)
    public Response sendOwners() throws JsonProcessingException {
        String accessToken = ((JsonWebToken) securityIdentity.getPrincipal()).getToken();
        return Response.ok(objectMapper.writeValueAsString(Map.of("success", accessToken))).build();
    }
}

关键流程说明

  • 当请求携带Authorization: Bearer <token>时,Quarkus的OIDC机制直接验证令牌有效性,通过后建立会话
  • 当请求携带Authorization: Basic <base64(username:password)>时,Quarkus自动调用OIDC Client的password授权接口,向Keycloak请求Bearer令牌,验证通过后同样建立用户会话,后续请求可复用会话无需重复调用Keycloak
  • 整个流程无需自定义认证机制,Quarkus内置逻辑已覆盖需求

排查要点

  • 确认Keycloak客户端已开启password授权类型
  • 检查OIDC Client的client-id、secret与Keycloak配置完全一致
  • 若需更细粒度的令牌信息,可直接注入JsonWebToken来获取Claims、过期时间等字段

内容的提问来源于stack exchange,提问作者Anthony Heaney

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:35:25