Kubernetes Java API不使用提供的用户名密码

时间:2018-01-11 23:32:49

标签: java kubernetes

这与Kubernetes Java客户端的0.2版有关。我猜测在Java API中使用基本身份验证的方法就是这样做

ApiClient client = Config.fromUserPassword( "https://....:6443", "user", "password", false );
Configuration.setDefaultApiClient( client );
CoreV1Api api = new CoreV1Api();
// Make api call like
api.listNode(...)

但是上面的代码总是返回403 Forbidden。从响应消息来看,它看起来并不像请求中使用了用户/通行证。

{"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"nodes is forbidden: User \"system:anonymous\" cannot list nodes at the cluster scope","reason":"Forbidden","details":{"kind":"nodes"},"code":403}

我也通过代码进行了一些调试,我可能正在回答我自己的问题,但它看起来像在CoreV1Api的方法中,它从不添加基本身份验证作为身份验证方法,只使用BearerToken。是否支持基本身份验证,或者我应该使用其他API类吗?

3 个答案:

答案 0 :(得分:0)

许多kubernetes集群没有设置基本身份验证,只设置了承载令牌身份验证。您确定您的群集配置了基本身份验证吗?

https://kubernetes.io/docs/admin/authentication/#static-password-file

答案 1 :(得分:0)

回答我自己的问题,但它看起来并不像当前版本的客户端实际执行用户/通过身份验证。但是BearerToken正在工作。

答案 2 :(得分:0)

Java客户端会忽略HttpBasicAuth对象,但是如果使用ApiKeyAuth对象并将密钥前缀设置为“ Basic”,并且将API密钥设置为base64编码的凭据,则它将起作用。 / p>

例如:

String credentials= new String(Base64.getEncoder().encode("user:password".getBytes())); ApiClient defaultClient = Configuration.getDefaultApiClient(); defaultClient.setBasePath("https://256.256.256.256"); ApiKeyAuth fakeBearerToken = (ApiKeyAuth) defaultClient.getAuthentication("BearerToken"); fakeBearerToken.setApiKey(credentials); fakeBearerToken.setApiKeyPrefix("Basic");

之所以可行,是因为kubernetes客户端将简单地将API密钥前缀与前缀连接起来,然后将结果放入“授权”标头中。