2017-10-24 2 views
2

Ich habe einen Java-Client für Teile von Livys REST-API unter geschrieben. Der Client verwendet Spring's RestTemplate.getForObject() und postForObject(), um GET- und POST-Anfragen zu machen. Der Livius-Server ist mit Kerberos gesichert.Livy-REST-API: GET-Anforderungen funktionieren, aber POST-Anfragen schlagen mit '401 Authentifizierung erforderlich' fehl

GET /sessions und GET /batches Anfragen funktionieren gut: Ich bekomme die erwarteten Antworten von Livy. Aber beide POST /sessions und POST /batches Anfragen scheitern mit:

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

Weiß jemand, warum die POST-Anfragen fehlschlagen, wenn die GET-Anforderungen erfolgreich sein? Mein Code tut nichts explizit mit der Authentifizierung.

Ich habe versucht, als mehrere verschiedene Benutzer über Kerberos zu authentifizieren, aber ich bekomme immer dieses Problem. Benötigt Livy eine zusätzliche Konfiguration, um POST-Anfragen von bestimmten Benutzern zuzulassen (da POST-Anfragen effektiv interaktive Sitzungen erstellen oder Jobs an Spark senden)?

+0

Haben Sie die gesendeten/empfangenen HTTP-Header während der SPNego-Verhandlung (die immer mit einer '401'-Abfrage beginnt, aber mit' 200' oder '403' enden sollte) verfolgt? Jeder sichtbare Unterschied in der Sequenz von Ereignissen für _GET_ und _POST_ z. eine Umleitung irgendwann? –

+0

Es gab ein ähnliches Problem mit WebHDFS, vor langer Zeit, aber wegen eines Fehlers in Java 6 'net'library ... hoffentlich verwenden Sie etwas neueres! –

+0

Danke für die Tipps! Nein, ich verwende Java 8 (und Livy v0.3.0 BTW). Ich habe es nicht geschafft, diese HTTP-Header zu verfolgen, aber es sieht so aus, als ob Livy im Vergleich zu GET-Anfragen zusätzliche Sicherheit für POST-Anfragen benötigt. Ich versuche gerade mit einer speziellen Version von Spring's 'RestTemplate' mit Kerberos zu arbeiten: [' KerberosRestTemplate'] (https://docs.spring.io/spring-security-kerberos/docs/current/reference/html/ssk-resttemplate. html). Werde mehr posten, wenn ich in ein paar Tagen noch eine Chance bekomme ... – snark

Antwort

3

Es stellt sich heraus, dass, während die reguläre org.springframework.web.client.RestTemplate Klasse für GET-Anforderungen ausreicht, müssen Sie org.springframework.security.kerberos.client.KerberosRestTemplate für POST-Anfragen verwenden. Sie müssen möglicherweise auch einen zusätzlichen Header zu POST-Anforderungen hinzufügen, wenn der Livry Server CSRF (Cross-Site Request Forgery) -Schutz aktiviert hat, wie beschrieben here.

GET/Chargen Beispiel

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

wo GetBatchesResponse eine einfache POJO ist Ich habe geschrieben, dass die response body-GET /batches darstellt.

POST/Chargen Beispiel

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

KerberosRestTemplate kerberosRestTemplate = new KerberosRestTemplate("path_to_your_key_tab_file", "[email protected]_realm"); 

// Add CSRF header if required: 
HttpHeaders headers = new HttpHeaders(); 
headers.set("X-Requested-By", "[email protected]_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); 

wo PostBatchesRequest und Batch sind POJOs ich geschrieben habe, die request body und response jeweils darzustellen.

+1

Dank Hortonworks kann ich bei dieser Lösung helfen! – snark

Verwandte Themen