簡體   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