使用Keycloak Admin Client获取AccessToken时遭遇404错误求助
问题分析与解决方案
核心问题梳理
- Server URL配置混淆:代码中使用
quarkus.oidc.auth-server-url作为Keycloak Admin Client的服务器地址,但该配置是带Realm路径的OIDC端点地址,而Admin Client需要的是Keycloak服务器的根地址(不带Realm)。 - Realm名称不匹配:测试环境通过
realm-path导入了shopping-realm.json,但配置的quarkus.keycloak.realm-name却是quarkus,导致请求的端点不存在,返回404。 - 硬编码端口风险:Quarkus Dev Service默认随机分配端口,硬编码
http://localhost:8080可能与实际运行的Keycloak端口不符。
修复步骤
1. 修正代码中的配置注入
替换注入的配置项,使用Admin Client专属的服务器地址和Realm配置:
@ApplicationScoped @RequiredArgsConstructor public class AuthenticationApiImpl implements AuthenticationApi { // 改用Admin Client的服务器地址配置 @ConfigProperty(name = "quarkus.keycloak.admin-client.server-url") String serverUrl; // 改用Admin Client的Realm配置 @ConfigProperty(name = "quarkus.keycloak.admin-client.realm") String realm; private final ErrorMapper errorMapper = Mappers.getMapper(ErrorMapper.class); @Override public Response authentication(CredentialDto credentialDto) { try(Keycloak keycloak = KeycloakBuilder.builder() .clientId(credentialDto.getClientId()) .clientSecret(credentialDto.getClientSecret()) .realm(realm) .serverUrl(serverUrl) .grantType(OAuth2Constants.CLIENT_CREDENTIALS) .build()){ return Response .ok(keycloak.tokenManager().getAccessToken()) .build(); } } }
2. 调整测试环境配置
修正Realm名称,使用Dev Service自动生成的地址,补充OIDC的正确端点:
##----------TEST----------------## %test.quarkus.keycloak.admin-client.enabled=true # 自动获取Dev Service的Keycloak地址,避免硬编码端口 %test.quarkus.keycloak.admin-client.server-url=${quarkus.keycloak.devservices.url} # 与导入的Realm文件名称匹配 %test.quarkus.keycloak.admin-client.realm=shopping-realm %test.quarkus.keycloak.admin-client.client-id=quarkus %test.quarkus.keycloak.admin-client.client-secret=secret %test.quarkus.keycloak.devservices.enabled=true %test.quarkus.oidc.credentials.secret=iJZaGcPoHhkccbs9mLo4Mhu1w0TmamZl %test.quarkus.keycloak.devservices.realm-path=realms/shopping-realm.json %test.quarkus.keycloak.realm-name=shopping-realm # 补充OIDC的正确授权服务器地址(Dev Service地址+Realm) %test.quarkus.oidc.auth-server-url=${quarkus.keycloak.devservices.url}/realms/shopping-realm
3. 验证Client配置
确保shopping-realm中的quarkus客户端已启用Client Credentials授权类型,且service-account拥有必要权限。
4. 关于RESTEasy依赖的说明
quarkus-resteasy-jackson与quarkus-resteasy-reactive-jackson的差异不会导致此问题,前者为传统JAX-RS实现,后者为响应式实现,两者均兼容Keycloak Admin Client。
内容的提问来源于stack exchange,提问作者junior siembe
相关产品推荐
相关产品推荐

