繁体   English   中英

Jenkins 在请求标头中传递 crumb 后在 EC2 服务器中给出 403

[英]Jenkins giving 403 in EC2 Server after passing the crumb in the request headers

我在 API 调用中使用 CSRF Jenkins 碎屑从 ZD52387280E1EA21938A17 在 Jenkins 中创建一个新作业

我尝试了以下

调用 API 获取 crumb 数据

http://admin:11542c80972c3a2b863453d234de68b1d@10.139.163.33/crumbIssuer/api/json

我也试过下面的 URL

http://10.139.163.33/crumbIssuer/api/json

下面是从服务器获取的 JSON 响应

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

在下一步中,我将调用 Jenkins 以使用 header 创建一个新作业

Jenkins-Crumb:b272a09b604e7b7cc8ee1431f0a0143fa1422db2fb5f92955b0356a31da37463

Jenkins 给了我 403,我正在使用 HttpGet 获取令牌并使用 HttpPost 与 header 如上所述并发送到 jenkins。

当我尝试使用 postman 时,它没有给出这个错误。 我在一台 ec2 服务器上运行 Java 应用程序,在另一台 ec2 服务器上运行 jenkins。

没有代理,我也尝试使用各种选项,如启用代理兼容性、重新启动 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 命令,但仍然得到相同的响应

我能够通过对 CRUMB 和 POST 请求使用相同的 HttpClient (CloseableHttpClient) 来解决此问题。 早些时候,我使用了 2 个单独的客户端,一个用于获取面包屑,另一个用于发布数据。 为这两者使用共享的 httpclient 导致成功 state。

希望这可以帮助任何其他面临类似问题的开发人员。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM