調用Jenkins API

測試的同窗忽然跟我說要在Nodejs上調起Jenkins(https://jenkins.io/)構建,我首先想到就是調用Jenkins的API,可是具體怎麼作呢?程序員

經過fiddler(http://www.telerik.com/fiddler)找到點擊構建時候調用的API:json

clipboard.png

找到了相似 POST: http://jenkins_url/view//job/... 結構API
I get you! 講道理經過直接post到上述接口就能夠了,固然要複製cookie以繞開登陸。說幹就幹,在ARC(Advanced REST client)添加URL,拷貝cookie進去,點擊發送,發現如下錯誤:api

Error 403 No valid crumb was included in the request

這個明顯就是CSRF校驗擋住了個人路。雖然我總喜歡在本身的項目加CSRF校驗,可是無比討厭別人的站點也加,這個明顯就是不讓我作壞事嘛。可是簡單的CSRF就能阻止程序員搞事情麼?開玩笑!
根據CSRF的原理,要破也是很簡單的嘛。首先咱們能夠向服務器請求一次拿到一個token值,而後再發第二次請求時帶上token就能夠了。
先去Google搜一下"jenkins CSRF",找到這樣一篇文章,https://wiki.jenkins.io/displ...安全

jenkins官方wiki就提供了完整方法。服務器

CSRF Protection
If your Jenkins uses the "Prevent Cross Site Request Forgery exploits" security option (which it should), when you make a POST request, you have to send a CSRF protection token as an HTTP request header.cookie

For curl/wget you can obtain the header needed in the request from the URL JENKINS_URL/crumbIssuer/api/xml (or .../api/json). Something like this:curl

wget -q --auth-no-challenge --user USERNAME --password PASSWORD --output-document - \
'JENKINS_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'

還好我略懂英文。文章已經很清楚地指出能夠經過GET JENKINS_URL/crumbIssuer/api/xml的方式拿到一個crumbRequestField和crumb,而後在下一次請求帶上就能夠了。post

上面的代碼轉換成常規http請求就是:測試

get: http://USERNAME:PASSWORD@JENKINS_URL/crumbIssuer/api/xml

我查了一下文檔,發現其實也能夠用jsonui

get: http://USERNAME:PASSWORD@JENKINS_URL/crumbIssuer/api/json

注意: 必定不能忘了加USERNAME:PASSWORD哦

那些喜歡用curl的同窗能夠用如下的語句:

curl -X GET http:/JENKINS_URL/crumbIssuer/api/json --user USERNAME:PASSWORD

返回的結果結構以下:

{"_class":"hudson.security.csrf.DefaultCrumbIssuer","crumb":"******","crumbRequestField":"Jenkins-Crumb"}

拿到crumb以後放到請求頭就能夠了,例如我用curl能夠這樣寫:

curl -X POST JENKINS_URL/job/JOB_NAME/build \
  --user USER:PASSWORD \
  --header "Jenkins-Crumb:***"

執行一下,發現jenkins能夠自動構建了,打完收工。

有安全潔癖的同窗看到USERNAME:PASSWORD就很不爽,其實能夠用token代替password, 即USERNAME:TOKEN
在用戶設置中能夠看到本身的Token

clipboard.png

相關文章
相關標籤/搜索