如何让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)
- 建议注入
SecurityIdentity而非Tokens,它能直接获取认证后的用户信息及令牌上下文 - 复用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
相关产品推荐
相关产品推荐

