5

我在https://github.com/apache/incubator-livy/blob/master/docs/rest-api.md为 Livy 的部分 REST API 编写了一个 Java 客户端。客户端使用 Spring 的RestTemplate.getForObject()postForObject()分别发出 GET 和 POST 请求。Livy 服务器由 Kerberos 保护。

GET /sessions并且GET /batches请求工作正常:我得到了 Livy 的预期回复。但是POST /sessionsPOST /batches请求都失败了:

org.springframework.web.client.HttpClientErrorException: 401 Authentication required

有谁知道为什么 GET 请求成功时 POST 请求失败?我的代码对身份验证没有任何明确的作用。

我尝试过通过 Kerberos 以几个不同的用户身份进行身份验证,但我总是遇到这个问题。Livy 是否需要额外的配置来允许来自特定用户的 POST 请求(因为 POST 请求有效地创建交互式会话或向 Spark 提交作业)?

4

1 回答 1

6

事实证明,虽然常规org.springframework.web.client.RestTemplate类足以满足 GET 请求,但您需要使用org.springframework.security.kerberos.client.KerberosRestTemplatePOST 请求。如果 Livy 服务器启用了 CSRF(跨站点请求伪造)保护,您可能还需要向 POST 请求添加额外的标头,如此处所述

GET /批处理示例

RestTemplate restTemplate = new RestTemplate();
GetBatchesResponse response2 = restTemplate.getForObject("http://your_livy_server:8998" + "/batches", GetBatchesResponse.class);

GetBatchesResponse我写的一个简单的POJO代表GET /batches.

POST /批处理示例

PostBatchesRequest postRequestBody = new PostBatchesRequest();
postRequestBody.setFile("/path/to/your/application"); // In HDFS

KerberosRestTemplate kerberosRestTemplate = new KerberosRestTemplate("path_to_your_key_tab_file", "your_user@your_realm");

// Add CSRF header if required:
HttpHeaders headers = new HttpHeaders();
headers.set("X-Requested-By", "your_user@your_realm");
headers.setContentType(MediaType.APPLICATION_JSON);

HttpEntity<PostBatchesRequest> postRequest = new HttpEntity<PostBatchesRequest>(postRequestBody, headers);

Batch batch = kerberosRestTemplate.postForObject("http://your_livy_server:8998" + "/batches", postRequest, Batch.class);

我编写的 POJO在哪里PostBatchesRequest和是分别代表请求正文响应的 POJO 。Batch

于 2017-11-02T16:04:01.663 回答