2013-05-24 12 views
12

Desidero utilizzare l'API Jenkins Remote e sto cercando una soluzione sicura. Mi sono imbattuto in Prevent Cross Site Request Forgery exploits e voglio usarlo, ma ho letto da qualche parte che devi fare una briciola richiesta.Come richiedere l'emittente di briciole per jenkins

Qualcuno potrebbe spiegare come ottenere una richiesta di briciole per far funzionare l'API?

Ho trovato questo https://github.com/entagen/jenkins-build-per-branch/pull/20 ma ancora non so come risolverlo.

versione mio Jenkins è 1.50.x

https://issues.jenkins-ci.org/browse/JENKINS-10374

risposta

21

non ho trovato questo nella documentazione sia. Questo codice è stato testato contro un vecchio Jenkins (1.466), ma dovrebbe comunque funzionare.

Per emettere utilizzare la mollica del crumbIssuer

// left out: you need to authenticate with user & password -> sample below 
HttpGet httpGet = new HttpGet(jenkinsUrl + "crumbIssuer/api/json"); 
String crumbResponse = toString(httpclient, httpGet); 
CrumbJson crumbJson = new Gson().fromJson(crumbResponse, CrumbJson.class); 

questo modo si ottiene una risposta come questa

{"crumb":"fb171d526b9cc9e25afe80b356e12cb7","crumbRequestField":".crumb"} 

Questo contiene due pezzi di informazioni di cui avete bisogno

  1. il nome del campo con il quale è necessario passare la briciola
  2. la briciola stessa

Se si desidera recuperare qualcosa da Jenkins, aggiungere la briciola come intestazione. Nell'esempio seguente, recupero gli ultimi risultati di compilazione.

HttpPost httpost = new HttpPost(jenkinsUrl + "rssLatest"); 
httpost.addHeader(crumbJson.crumbRequestField, crumbJson.crumb); 

Ecco il codice di esempio nel suo insieme. Sto usando gson 2.2.4 per analizzare la risposta e Apache's httpclient 4.2.3 per il resto.

+0

Confermato nella versione 2.19 di Jenkins. Ancora lavorando. – teodron

2

La risposta di cui sopra ha aiutato il 90%, grazie per averci dato la giusta direzione.

Il 10% mancante ruotava attorno al nome utente Http & password auth.

Dal momento che l'API Codenameone java stavo usando non hanno avuto la Classe di autenticazione di seguito:

new UsernamePasswordCredentials(usernName, password)); 

ho usato:

String apiKey = "yourJenkinsUsername:yourJenkinsPassword"; 
httpConnection.addRequestHeader("Authorization", "Basic " + Base64.encode(apiKey.getBytes())); 
1

Oppure si può usare Python e le richieste invece

req = requests.get('http://JENKINS_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)', auth=(username, password)) 

ti darà il nome e la briciola

Jenkins-Crumb:e2e41f670dc128f378b2a010b4fcb493 
Problemi correlati