【问题标题】:POST build to TeamCity queuePOST 构建到 TeamCity 队列
【发布时间】:2021-09-02 15:57:28
【问题描述】:

我正在尝试使用 TeamCity REST API 将构建添加到队列中,但在授权方面遇到了一些困难。

我已经定义了我们的 teamcity 服务器的 url,并通过管理页面生成了一个授权令牌

TEAMCITY_URL = 'http://teamcity.somedomain.com'
BEARER_TOKEN = 'SOMELONGTOKEN'

使用此 URL 和令牌,我可以成功发出 GET 请求

import json
import requests

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

response = session.get(f'{TEAMCITY_URL}/app/rest/projects/example/buildTypes')
assert(response.status_code == requests.codes.ok)  # this succeeds, can parse response fine later

但是如果我尝试 POST 构建到队列中,我会得到 403

payload = {
    'branchName': 'master',
    'buildType': {
        'id': buildID  # assume this was already defined
    }
}

response = session.post(f'{TEAMCITY_URL}/app/rest/buildQueue', json=payload)
assert(response.status_code == requests.codes.ok)  # fails with 403

后者response.text

'403 Forbidden: Responding with 403 status code due to failed CSRF check: authenticated POST request is made, but not tc-csrf-token parameter and X-TC-CSRF-Token header is provided.. 对于临时解决方法,您可以设置内部属性 teamcity.csrf.paranoid=false 并在您的请求中提供有效的 Origin={teamcity_url} 标头\n'

如何正确使用此不记名令牌来执行POST 请求?

【问题讨论】:

    标签: python rest python-requests teamcity


    【解决方案1】:

    解决这个问题的方法是我需要首先发出GET 请求 CSRF 令牌。然后我可以使用这个令牌来更新带有'X-TC-CSRF-Token' 的会话标头,如下所示

    response = session.get(f'{TEAMCITY_URL}/authenticationTest.html?csrf')
    assert(response.status_code == requests.codes.ok)
    csrf_token = response.text
    session.headers.update({
        'X-TC-CSRF-Token': csrf_token
    })
    

    那么后续的POST 就会成功。更多详情official docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      相关资源
      最近更新 更多