【发布时间】:2020-07-27 01:35:41
【问题描述】:
我在 API 调用中使用 CSRF Jenkins crumbs 从 Java 在 Jenkins 中创建新作业。
我尝试了以下
调用 API 获取 crumb 数据
http://admin:11542c80972c3a2b863453d234de68b1d@10.139.163.33/crumbIssuer/api/json
我也尝试了以下网址
以下是从服务器获取的JSON响应
{"_class":"hudson.security.csrf.DefaultCrumbIssuer","crumb":"b272a09b604e7b7cc8ee1431f0a0143fa1422db2fb5f92955b0356a31da37463","crumbRequestField":"Jenkins-Crumb"}
在下一步中,我正在调用 Jenkins 以创建一个标题为的新作业
Jenkins-Crumb:b272a09b604e7b7cc8ee1431f0a0143fa1422db2fb5f92955b0356a31da37463
Jenkins 给了我 403,我正在使用 HttpGet 获取令牌并使用带有上述标头的 HttpPost 并发送给 jenkins。
当我尝试使用邮递员时,它没有给出这个错误。我在 1 台 ec2 服务器上运行 Java 应用程序,而 jenkins 在另一台 ec2 服务器上运行。
没有代理,我也尝试使用各种选项,如启用代理兼容性、重新启动 jenkins 等,但不起作用。
请指点。
使用的Java代码是
HttpPost postRequest = new HttpPost(url);
JenkinsCrumb crumb = jenkinsHelper.getCrumb();
String encodedPassword = Base64.getEncoder().encodeToString((user + ":" + pwd).getBytes());
postRequest.addHeader(HttpHeaders.AUTHORIZATION, "Basic " + encodedPassword);
postRequest.addHeader(new BasicHeader(crumb.getCrumbRequestField(), crumb.getCrumb()));
return postRequest;
获取面包屑的代码是
String urlWithToken = "http://" + (user + ":" + pwd) + "@";
HttpGet request = new HttpGet(jenkinsBaseUrl.replace("http://", urlWithToken) + "crumbIssuer/api/json");
request.addHeader(HttpHeaders.AUTHORIZATION, "Basic " + encodedPassword);
CloseableHttpResponse httpResponse = httpClient.execute(request);
我也尝试过使用 CURL 命令,但仍然得到相同的响应
【问题讨论】: