【发布时间】:2017-09-05 09:33:22
【问题描述】:
我想通过 Jenkins 中的 API 作业创建,但我无法在 Jenkins 中连接 CSRF 保护。我有一个碎屑,但我不知道如何将它附加到 JSON 或 JavaScript 中的 url/request 以通过 POST 方法传递数据。有任何想法吗?我只想用 JS 做,而不用 JAVA。谢谢
【问题讨论】:
标签: javascript json jenkins csrf-protection
我想通过 Jenkins 中的 API 作业创建,但我无法在 Jenkins 中连接 CSRF 保护。我有一个碎屑,但我不知道如何将它附加到 JSON 或 JavaScript 中的 url/request 以通过 POST 方法传递数据。有任何想法吗?我只想用 JS 做,而不用 JAVA。谢谢
【问题讨论】:
标签: javascript json jenkins csrf-protection
请记住,您获得的 curl 与会话相关联。这意味着您必须在请求 crumb 时获取 cookie ..然后在运行作业时设置 cookie
crumb=`curl -s -X GET "http://jenkins/crumbIssuer/api/json" --user usr:passwd --cookie-jar /tmp/crumcookie | tr ',' '\n' |grep '"crumb"' | sed 's/"//g' | awk -F ':' '{print $2}'`
echo "We got a crumb >> $crumb"
curl -X POST "http://jenkins/job/remoteTest/build" --user usr:passwd --cookie /tmp/crumcookie -H "Jenkins-Crumb:$crumb"
echo "Job has been launched"
【讨论】:
应该很容易。为了通过 Jenkins 中的 CSRF,您需要做的事情很少。
#1
获取一个有效的实际 CSRF crumb,为此您应该使用“/crumbIssuer”端点。 AFAIK,这是一个受保护的端点,因此您应该使用 API 令牌或请求中的凭据对其进行经过身份验证的调用。在这里我将如何在 JavaScript 中做到这一点:
// **** - is a placeholder for an auth token, replace it with yours
$.get({
url: "https://my.jenkins.io/crumbIssuer/api/json",
contentType: "application/json",
headers: {
"User-Agent": "my_js_script",
"Authorization": "****"
}
}).done(function(data) {
// this is how you fetch valid & actual CSRF crumb
console.log(data.crumbRequestField + " = " + data.crumb);
});
#2
现在,既然您已经掌握了有效且实际的 CSRF 碎屑,请务必将其与任何修改 Jenkins 状态的请求一起发送。可以说,您的有效 CSRF crumb JSON 看起来像这样:
{ "crumbRequestField": "Jenkins-Crumb", "crumb": "noop" }
因此您的 Ajax 调用看起来有点像这样(注意额外的“Jenkins-Crumb”HTTP 标头):
// **** - is a placeholder for an auth token, replace it with yours
// simply activates a job in Jenkins, requirement for cloned jobs (aka. "Create-A-Copy-From")
$.post({
url: "https://my.jenkins.io/job/my_job/description",
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
headers: {
"User-Agent": "my_js_script",
"Authorization": "****",
"Jenkins-Crumb": "noop" // makes CSRF filter in Jenkins happy
},
data: "description="
});
这些 JavaScript sn-ps 不太可能完美,但希望能给你正确的方向。
我正在开发一个项目,它是 Jenkins API 库,但使用的是 Ruby。如果您需要阅读一些实际执行您正在寻找的源代码,以下是一些可能感兴趣的文件:
【讨论】:
Request header field Jenkins-Crumb is not allowed by Access-Control-Allow-Headers in preflight response. 有什么想法吗?