2013-05-24 20 views
12

Jenkins Remote APIを使用したいと思います。私は安全なソリューションを探しています。私はPrevent Cross Site Request Forgery exploitsに出くわしました。私はそれを使いたがっていますが、どこかであなたがパン粉のリクエストをしなければならないと読んでいます。jenkinsのCrumb発行者のリクエスト方法

APIを動作させるためにクラムリクエストを取得する方法を教えてもらえますか?

私はこれを見つけましたhttps://github.com/entagen/jenkins-build-per-branch/pull/20しかし、まだそれを修正する方法がわかりません。

マイジェンキンスバージョンは、私はどちらかのドキュメントでこれを発見していない1.50.x

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

答えて

21

です。このコードは古いJenkins(1.466)に対してテストされていますが、動作するはずです。これは、これはあなたが

  1. フィールド名を必要とする2つの情報を含んでいるあなたにこの

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

    のような応答を取得します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); 
    

    を使用クラムを発行する

    あなたはパン粉を渡す必要があります

  2. クラムそのもの

今、Jenkinsから何かを取得したい場合は、crumbをヘッダーとして追加します。下のサンプルでは、​​最新のビルド結果を取得します。

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

ここにサンプルコード全体があります。応答を解析するためにgson 2.2.4を使用し、残りの部分はApache's httpclient 4.2.3を使用しています。

import org.apache.http.auth.*; 
import org.apache.http.client.*; 
import org.apache.http.client.methods.*; 
import org.apache.http.impl.client.*; 

import com.google.gson.Gson; 

public class JenkinsMonitor { 

    public static void main(String[] args) throws Exception { 

     String protocol = "http"; 
     String host = "your-jenkins-host.com"; 
     int port = 8080; 
     String usernName = "username"; 
     String password = "passwort"; 

     DefaultHttpClient httpclient = new DefaultHttpClient(); 
     httpclient.getCredentialsProvider().setCredentials(
       new AuthScope(host, port), 
       new UsernamePasswordCredentials(usernName, password)); 

     String jenkinsUrl = protocol + "://" + host + ":" + port + "/jenkins/"; 

     try { 
      // get the crumb from Jenkins 
      // do this only once per HTTP session 
      // keep the crumb for every coming request 
      System.out.println("... issue crumb"); 
      HttpGet httpGet = new HttpGet(jenkinsUrl + "crumbIssuer/api/json"); 
      String crumbResponse= toString(httpclient, httpGet); 
      CrumbJson crumbJson = new Gson() 
       .fromJson(crumbResponse, CrumbJson.class); 

      // add the issued crumb to each request header 
      // the header field name is also contained in the json response 
      System.out.println("... issue rss of latest builds"); 
      HttpPost httpost = new HttpPost(jenkinsUrl + "rssLatest"); 
      httpost.addHeader(crumbJson.crumbRequestField, crumbJson.crumb); 
      toString(httpclient, httpost); 

     } finally { 
      httpclient.getConnectionManager().shutdown(); 
     } 

    } 

    // helper construct to deserialize crumb json into 
    public static class CrumbJson { 
     public String crumb; 
     public String crumbRequestField; 
    } 

    private static String toString(DefaultHttpClient client, 
     HttpRequestBase request) throws Exception { 
     ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
     String responseBody = client.execute(request, responseHandler); 
     System.out.println(responseBody + "\n"); 
     return responseBody; 
    } 

} 
+0

Jenkinsのバージョン2.19で確認済みです。まだ働いています。 – teodron

2

上記の回答は、私たちに正しい方向を教えていただきありがとうございました。

不足している10%は、Httpユーザー名&パスワード認証を中心にしています。

私が使っていたCodenameoneのJava APIには、以下の認証クラスを持っていなかったので:

new UsernamePasswordCredentials(usernName, password)); 

私が使用:

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

それとも、代わりに

req = requests.get('http://JENKINS_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)', auth=(username, password)) 
をPythonと要求を使用することができますが

あなたに名前とクラムが与えられます

Jenkins-Crumb:e2e41f670dc128f378b2a010b4fcb493 
0

上記のJavaスニペットは、Jenkins v2.89.3(Eclipse.org)と私が使用する別のJenkinsインスタンスv2.60.3(一度有効[1])で素晴らしい仕事をしてくれました。

[1] https://wiki.jenkins.io/display/JENKINS/CSRF+Protection

I [2]私はバックサーバにローカルに編集されたconfig.xmlの変更をプッシュするために使用するMavenのモジョにこれを追加しました。

[2] https://github.com/nickboldt/maven-plugins/tree/master/hudson-job-sync-plugin

ありがとう!

関連する問題