Livy REST API:GET 请求有效,但 POST 请求失败并显示“需要 401 身份验证”

sna*_*ark 5 kerberos spring-rest livy

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

GET /sessionsGET /batches请求工作正常:我得到了 Livy 的预期响应。但是POST /sessionsPOST /batches请求都失败了:

org.springframework.web.client.HttpClientErrorException: 401 Authentication required
Run Code Online (Sandbox Code Playgroud)

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

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

sna*_*ark 6

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

GET /batches 示例

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

这里GetBatchesResponse是一个简单的POJO我已经写了代表响应体GET /batches

POST /batches 示例

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);
Run Code Online (Sandbox Code Playgroud)

其中PostBatchesRequestBatch是我编写的分别代表请求正文响应的POJO 。