You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins客户端认证失败:代码执行返回403错误,请求排查代码正确性

排查Jenkins API调用403错误问题

请检查以下代码是否正确,当前执行会返回403错误。


这是用于运行2个Jenkins任务的Java程序片段:

  • "Map keys"是数据库表的列名,存储URI、用户名、API令牌及要触发的任务路径
  • config输入是保存这些值的JSONArray
  • logger是log4j的实现实例
  • env字符串是Jenkins任务用来指定服务器环境(如DEVELOPMENT、TEST等)的关键字

复现问题时,可添加重载方法强制设置所有配置值(使用自己的URI、用户、API令牌和测试任务路径即可)。

我已在Jenkins服务器上创建了与登录ID关联的API令牌,但运行代码返回403错误。查看Jenkins个人资料时,该令牌显示“从未使用”(不确定是指从未尝试使用,还是从未成功登录使用),因此我已经试过使用API令牌名称和令牌值两种方式。

API令牌配置截图

我们的Jenkins服务器使用自签名证书,所以我添加了忽略证书违规的代码。使用的客户端库:

import com.offbytwo.jenkins.JenkinsServer;
import com.offbytwo.jenkins.client.JenkinsHttpClient;

代码

public boolean deployCertificate(Logger logger, JSONArray config, String env) {
    boolean procRun = false;
    // Define map keys
    final String MYJOB = "TOP_CERTIFICATE_DEPLOY";
    final String MYURL = "TOP_JENKINS_BASE_URL";
    final String MYLID = "TOP_JENKINS_ID";
    final String MYLPW = "TOP_JENKINS_AUTH";
    // Create JSON Object from JSONArray "config"
    JSONObject jsonObject = config.getJSONObject(0);
    Map<String,String> jenkParams = new HashMap<String,String>();
    jenkParams.put("ENV", env);
    
    // Set up CloseableHttpClient because the Jenkins server has a self-signed certificate
    try {
        CredentialsProvider provider = new BasicCredentialsProvider();
        // The password is a Jenkins API token
        provider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(jsonObject.getString(MYLID), jsonObject.getString(MYLPW)));
        URI jenkinsUri = new URI(jsonObject.getString(MYURL));
        SSLContext sslContext = new SSLContextBuilder()
                .loadTrustMaterial(null, (chain, authType) -> true)
                .build();
        SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(
                sslContext, 
                new AllowAllHostnameVerifier()
                );
        CloseableHttpClient httpClient = HttpClientBuilder
                .create()
                .setSSLSocketFactory(socketFactory)
                .setDefaultCredentialsProvider(provider)
                .build(); 
        JenkinsHttpClient client = new JenkinsHttpClient(
                jenkinsUri,
                httpClient
                );
        JenkinsServer jenkinsServer = new JenkinsServer(client);
        jenkinsServer.getJob(jsonObject.getString(MYJOB)).build(jenkParams);
        jenkinsServer.close();
        procRun = true;
    } catch (IOException | KeyManagementException | NoSuchAlgorithmException | KeyStoreException | URISyntaxException e) {
        logger.error("Jenkins job {} failed: " + e);
        return procRun;
    }
    return procRun;
}

403错误排查关键点:

  • 确认API令牌值:Jenkins API令牌必须使用生成的令牌值而非名称,核对数据库TOP_JENKINS_AUTH字段存储的是否是令牌的完整Value(对应截图中的令牌值部分)。
  • 检查用户权限:确保你的Jenkins账号拥有目标任务TOP_CERTIFICATE_DEPLOY的构建权限和任务读取权限,可手动登录Jenkins尝试触发任务验证。
  • 验证凭证传递逻辑:尝试改用offbytwo-jenkins库的默认构造器传入用户名和令牌,排除自定义HttpClient的配置问题:
    JenkinsServer jenkinsServer = new JenkinsServer(new URI(jsonObject.getString(MYURL)), jsonObject.getString(MYLID), jsonObject.getString(MYLPW));
    
    如果此方式能成功,说明自定义HttpClient的凭证配置存在问题。
  • 检查Jenkins安全设置:确认Jenkins开启了API令牌认证,且无额外安全插件(如CAS、OpenID)导致基础认证失效。
  • 查看Jenkins服务器日志:在$JENKINS_HOME/logs目录下找到对应403请求的日志,查看具体拒绝原因(凭证无效/权限不足等)。

内容的提问来源于stack exchange,提问作者Keith Fosberg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 06:13:15