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

使用TeamCity REST API POST添加构建到队列报403错误如何解决?

问题根因

你遇到的403错误和Bearer令牌本身无关,是TeamCity默认对经过身份认证的修改类请求(POST/PUT/DELETE)开启了CSRF校验,需要额外提供对应校验字段。


方案1:标准方案(无需修改服务器配置,推荐)

TeamCity提供了专门的接口获取CSRF令牌,你只需要在发起POST请求前,先通过已授权的会话获取令牌并加入请求头即可。
修改后的完整代码示例:

import json
import requests

TEAMCITY_URL = 'http://teamcity.somedomain.com'
BEARER_TOKEN = 'SOMELONGTOKEN'
buildID = "你的构建配置ID" # 提前定义好的构建ID

session = requests.Session()
session.headers.update({
    'Accept': 'application/json',
    'Authorization': f'Bearer {BEARER_TOKEN}',
})

# 校验令牌有效性(原有GET请求逻辑)
response = session.get(f'{TEAMCITY_URL}/app/rest/projects/example/buildTypes')
assert(response.status_code == requests.codes.ok)

# 新增:获取CSRF令牌并更新请求头
csrf_response = session.get(f'{TEAMCITY_URL}/app/rest/server/csrfToken')
csrf_token = csrf_response.json()['token']
session.headers['X-TC-CSRF-Token'] = csrf_token

# 发起POST请求添加构建到队列
payload = {
    'branchName': 'master',
    'buildType': {
        'id': buildID
    }
}
response = session.post(f'{TEAMCITY_URL}/app/rest/buildQueue', json=payload)
assert(response.status_code == requests.codes.ok)

方案2:临时调试方案(需修改服务器配置,不推荐生产使用)

如果你只是临时调试,可以按错误提示的方法操作:

  • 登录TeamCity管理后台,添加内部属性 teamcity.csrf.paranoid=false 并重启服务
  • 发起请求时额外添加Origin头,值为你的TeamCity服务根地址:
    session.headers['Origin'] = TEAMCITY_URL
    
    之后就可以直接发起POST请求,无需额外传递CSRF令牌。
    注意:该方案会降低服务的CSRF防护等级,存在安全风险,仅适合本地调试场景使用。

内容的提问来源于stack exchange,提问作者Cory Kramer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 05:36:03