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

如何实现Cloudera Manager API Java客户端的正确授权与使用?

Knox SSO环境下Cloudera Manager API Java客户端认证解决方案

问题根源

你的Cloudera集群通过Knox网关对外暴露API,且启用了KnoxSSO认证机制,直接使用Basic Auth会被重定向到SSO登录页面,无法完成API认证。

解决步骤

1. 先获取Knox SSO会话凭证

需要先通过Knox的SSO认证接口提交用户名密码,获取有效的会话Cookie(核心是JSESSIONID),后续API请求携带该Cookie即可通过认证。

用curl测试流程

# 第一步:提交认证信息,保存Cookie到本地文件
curl -c auth_cookies.txt -X POST \
  https://....cloudera.site/gateway/knoxsso/api/v1/websso \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "j_username=你的用户名&j_password=你的密码"

# 第二步:携带Cookie调用API
curl -b auth_cookies.txt -H "Accept: application/json" \
  https://....cloudera.site/api/v32/clusters?clusterType=any

2. Java客户端实现完整认证流程

在Java代码中模拟上述curl流程,先获取Cookie,再配置API客户端携带Cookie:

import okhttp3.*;
import com.cloudera.api.swagger.client.ApiClient;
import com.cloudera.api.swagger.client.ApiException;
import com.cloudera.api.swagger.ClustersResourceApi;

import java.io.IOException;
import java.util.List;

public class CdpApiAuth {
    public static void main(String[] args) throws IOException, ApiException {
        // 替换为你的集群实际地址和账号信息
        String knoxSsoEndpoint = "https://....cloudera.site/gateway/knoxsso/api/v1/websso";
        String cmApiBaseUrl = "https://....cloudera.site/api";
        String username = "你的用户名";
        String password = "你的密码";

        // 1. 获取Knox SSO认证Cookie
        OkHttpClient httpClient = new OkHttpClient();
        FormBody authForm = new FormBody.Builder()
                .add("j_username", username)
                .add("j_password", password)
                .build();

        Request authRequest = new Request.Builder()
                .url(knoxSsoEndpoint)
                .post(authForm)
                .build();

        Response authResponse = httpClient.newCall(authRequest).execute();
        List<Cookie> cookies = Cookie.parseAll(knoxSsoEndpoint, authResponse.headers());
        authResponse.close();

        // 提取JSESSIONID Cookie
        String sessionId = null;
        for (Cookie cookie : cookies) {
            if ("JSESSIONID".equals(cookie.name())) {
                sessionId = cookie.value();
                break;
            }
        }

        if (sessionId == null) {
            throw new RuntimeException("Failed to get SSO session ID");
        }

        // 2. 配置Cloudera Manager API客户端
        ApiClient apiClient = Configuration.getDefaultApiClient();
        apiClient.setBasePath(cmApiBaseUrl);
        // 添加Cookie请求头
        apiClient.addDefaultHeader("Cookie", "JSESSIONID=" + sessionId);

        // 3. 调用API示例
        ClustersResourceApi clustersApi = new ClustersResourceApi(apiClient);
        // 打印集群列表
        System.out.println(clustersApi.readClusters("any"));
    }
}

3. 注意事项

  • 确认Knox SSO的端点路径正确,不同集群配置可能略有差异,可从浏览器登录时的跳转地址确认。
  • 如果集群使用OIDC等其他SSO协议,需要调整认证逻辑,比如获取Bearer Token并添加到Authorization头中。
  • 生产环境建议复用会话Cookie,避免频繁发起认证请求;也可考虑使用服务账号(若集群支持)简化认证流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 08:22:39