2013-05-24 9 views
12

Chcę używać zdalnego interfejsu API Jenkins i szukam bezpiecznego rozwiązania. Natknąłem się na Prevent Cross Site Request Forgery exploits i chcę go użyć, ale czytałem gdzieś, że trzeba zrobić prośbę okruchy.Jak poprosić o wystawcę Crumb dla jenkins

Czy ktoś mógłby wyjaśnić, w jaki sposób uzyskać żądanie okruchów, aby interfejs API działał?

Znalazłem to https://github.com/entagen/jenkins-build-per-branch/pull/20, ale wciąż nie wiem jak to naprawić.

wersja My Jenkins jest 1.50.x

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

Odpowiedz

21

nie znalazłem tego w dokumentacji albo. Ten kod jest testowany przeciwko starszemu Jenkins (1.466), ale powinien nadal działać.

do wydawania okruchy użyć 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); 

To będzie Ci odpowiedzi jak ten

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

zawiera dwie informacje trzeba

  1. nazwa pola z którymi musisz przejść miękiszu
  2. Sama okruchy

Jeśli chcesz pobrać coś od Jenkins, dodaj miękiszu jako nagłówek. W poniższym przykładzie pobieram najnowsze wyniki kompilacji.

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

Oto przykładowy kod jako całość. Używam gson 2.2.4 do analizy odpowiedzi i Apache's httpclient 4.2.3 dla reszty.

+0

Potwierdzono wersję 2.19 Jenkinsa. Wciąż pracuje. – teodron

2

Powyższa odpowiedź pomogła 90%, dzięki za wskazanie nam właściwego kierunku.

Brakujące 10% obraca się wokół nazwy użytkownika http: & hasło uwierzytelniające.

Ponieważ api Codenameone java używałem nie mieć klasę uwierzytelniania poniżej:

new UsernamePasswordCredentials(usernName, password)); 

użyłem:

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

Albo można użyć Python i żądania zamiast

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

poda nazwę i okruszynę

Jenkins-Crumb:e2e41f670dc128f378b2a010b4fcb493 
Powiązane problemy