使用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服务根地址:
之后就可以直接发起POST请求,无需额外传递CSRF令牌。session.headers['Origin'] = TEAMCITY_URL
注意:该方案会降低服务的CSRF防护等级,存在安全风险,仅适合本地调试场景使用。
内容的提问来源于stack exchange,提问作者Cory Kramer
相关产品推荐
相关产品推荐

