Hello
Following the ticket (Kerberos/Spnego/Tomcat/Jira 7 Integration : how to bypass login process? - #2 by ICDCInformatiqueCDC), I wanted to write a test client to access JIRA Rest API with Kerberos authentication, more specifically with cached Kerberos ticket.
No succcess with Spring and KerberosRestTemplate.
Some success with HttpComponents (httpclient-win) but complex code.
Great success with Waffle and Atlassian Jira Rest Java Client.
Here’s the method to get a cached Kerberos ticket :
public static String getKrbToken(String aTargetSPName) {
if (StringUtils.isEmpty(StringUtils.trim(aTargetSPName))) {
return null;
}
return BaseEncoding.base64()
.encode(WindowsSecurityContextImpl.getCurrent(securityPackage, aTargetSPName).getToken());
}
Then, the call for the Rest API :
WebResource webResource = Client.create().resource(restURL);
ClientResponse clientResponse = webResource
.header("Authorization", "Negotiate " + WindowsAuthenticator.getKrbToken(JiraRestClient.SPN))
.type(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
where restURL is the full url for the rest service you want to access.
or
WebResource webResource = Client.create().resource(restURL);
ClientResponse clientResponse = webResource
.header("Authorization", "Negotiate " + WindowsAuthenticator.getKrbToken(JiraRestClient.SPN))
.type(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON)
.post(ClientResponse.class, jsonReq);
where jsonReq is your String variable containing the input json stream, and JiraRestClient.SPN, the final variable containing the SPN matching the keytab file on the server side.
or
WebResource webResource = Client.create().resource(restURL);
ClientResponse clientResponse = webResource
.header("Authorization", "Negotiate " + WindowsAuthenticator.getKrbToken(JiraRestClient.SPN))
.type(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON).put(ClientResponse.class, jsonReq);
Then the code to get the response :
String jsonResp = new String(IOUtils.toString(clientResponse.getEntityInputStream()).getBytes(), "UTF-8");
Good luck !