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

使用Keycloak Admin Client获取AccessToken时遭遇404错误求助

问题分析与解决方案

核心问题梳理

  1. Server URL配置混淆:代码中使用quarkus.oidc.auth-server-url作为Keycloak Admin Client的服务器地址,但该配置是带Realm路径的OIDC端点地址,而Admin Client需要的是Keycloak服务器的根地址(不带Realm)。
  2. Realm名称不匹配:测试环境通过realm-path导入了shopping-realm.json,但配置的quarkus.keycloak.realm-name却是quarkus,导致请求的端点不存在,返回404。
  3. 硬编码端口风险: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 21:33:25