Livy REST API: запросы GET работают, но запросы POST завершаются с ошибкой `` требуется аутентификация 401 ''

Я написал клиент Java для частей REST API Ливи по адресу https://github.com/apache/incubator-livy/blob/master/docs/rest-api.md. Клиент использует RestTemplate.getForObject() и postForObject() Spring для выполнения запросов GET и POST соответственно. Сервер Livy защищен с помощью Kerberos.

GET /sessions и _ 4_ запросы работают нормально: я получаю ожидаемые ответы от Ливи. Но как POST /sessions, так и _ 6_ запросы завершаются ошибкой:

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

Кто-нибудь знает, почему запросы POST терпят неудачу, когда запросы GET успешны? Мой код ничего не делает явным с аутентификацией.

Я пробовал аутентифицироваться как несколько разных пользователей через Kerberos, но у меня всегда возникает эта проблема. Требуется ли Livy дополнительная конфигурация, чтобы разрешить запросы POST от определенных пользователей (поскольку запросы POST фактически создают интерактивные сеансы или отправляют задания в Spark)?


person snark    schedule 24.10.2017    source источник
comment
Вы отслеживали отправленные / полученные HTTP-заголовки во время согласования SPNego (которое всегда начинается с 401 запроса, но должно заканчиваться либо 200, либо 403)? Любая видимая разница в последовательности событий для GET и POST, например. перенаправление в какой-то момент?   -  person Samson Scharfrichter    schedule 25.10.2017
comment
Давным-давно была аналогичная проблема с WebHDFS, но из-за ошибки в Java 6 netlibrary ... надеюсь, вы используете что-то более свежее!   -  person Samson Scharfrichter    schedule 25.10.2017
comment
Спасибо за советы! Нет, я использую Java 8 (и Livy v0.3.0 BTW). Мне не удалось отследить эти HTTP-заголовки, но похоже, что Ливи требует дополнительной безопасности для запросов POST по сравнению с запросами GET. В настоящее время пытается использовать специальную версию Spring RestTemplate с Kerberos: _ 2_. Опубликую больше, когда у меня будет еще один шанс через несколько дней ...   -  person snark    schedule 25.10.2017
comment
В целях отладки вы можете попробовать curl HTTP-запрос командной строки (если Kerberos TGT доступен в кэше по умолчанию) с curl --negotiate -u : --trace-ascii - <some-GET-URL>, затем -X POST --data 'blah blah' <some-POST-URL>   -  person Samson Scharfrichter    schedule 26.10.2017


Ответы (1)


Оказывается, хотя обычный org.springframework.web.client.RestTemplate достаточно для запросов GET, вам нужно использовать _ 2_ для запросов POST. Вам также может потребоваться добавить дополнительный заголовок к запросам POST, если на сервере Livy включена защита CSRF (межсайтовая подделка запросов), как описано здесь.

Пример 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);

где PostBatchesRequest и Batch - объекты POJO, которые я написал для представления тело запроса и response соответственно.

person snark    schedule 02.11.2017
comment
Благодарим Hortonworks за помощь в достижении этого решения! - person snark; 02.11.2017
comment
Если возможно, вы также можете вставить импорт и зависимости? Мне сложно их найти. Я также пытаюсь отправить запрос Ливи. - person Explorer; 02.11.2019
comment
@Explorer - Вы не можете найти POJO (например, PostBatchesRequest), потому что я их написал. Это код компании, поэтому я не могу поделиться ими, но все, что я сделал, это написал Java-клиент для REST API Ливи и использовал org.springframework.web.client.RestTemplate для выполнения запросов GET или org.springframework.security.kerberos.client.KerberosRestTemplate для выполнения запросов POST .. - person snark; 04.11.2019