1

我正在使用 REST API 发送两个发布请求:http://localhost:8111/app/rest/buildQueue但我的第二个请求因 403 Forbidden 失败:由于 CSRF 检查失败而以 403 状态代码响应:没有“Origin”标头存在并且没有随请求提供身份验证,请考虑添加“Origin:http://localhost:8111 ”标头。我想知道为什么会发生这种情况,因为如果我在 UI 中运行构建并更改参数 ex。build1 的 %version=2% 和 build2 的 %version=3% 它将在不同的可用代理上彼此并行运行。

这是我发送的 json 请求

REST API:http://localhost:8111/app/rest/buildQueue JSON 正文:

{ "branchName":"master", "buildType":{ "id":"DockerBuild", "projectId":"Test" }, "properties":{ "property":[ { "name":"DOCKER_IMAGE_NAME", “价值”:“test-3”},{“名称”:“SNAPSHOT_DEPENDENCY_VERSION”,“价值”:“0.6”}]}}

我是否缺少能够彼此并行运行构建的参数?

403 Forbidden:由于 CSRF 检查失败而以 403 状态代码响应:不存在“Origin”标头且请求未提供身份验证,请考虑添加“Origin: http://localhost:8111 ”标头。

4

3 回答 3

1

也许这对某人有用,我在使用 Postman 的单个 POST 时遇到了同样的错误:

403 Forbidden: Responding with 403 status code due to failed CSRF check: no "Origin" header is present and no authentication provided with the request, consider adding "Origin: http://teamcity:20011" header.

所以我遵循了错误消息的建议,并在标题中添加了值为“ http://teamcity:20011 ”的“Origin”,从而解决了这个问题。顺便说一句,在授权中,我选择了“承载令牌”并粘贴了之前通过 TeamCity 生成的令牌。这是电话:

http://teamcity:20011/app/rest/buildQueue 

我只是在测试如何使用 API 触发构建并且它成功运行。现在接下来的步骤是使用 JavaScript 来实现这个调用。

于 2019-09-26T23:16:00.450 回答
1

使用适当的请求请求 CSRF 标头:https://teamcity/authenticationTest.html?csrf

并将其设置在您的 POST 请求的“X-TC-CSRF-TOKEN”标头中

于 2020-10-30T11:51:56.010 回答
1

当您在 TeamCity 中遇到有关 CSRF 保护的问题时(例如,您从服务器收到“由于 CSRF 检查失败而导致响应 403 状态码”响应),您可以按照以下步骤操作:

  • 如果您使用反向代理,请确保正确配置 Host/Origin 标头,如上所述。同时,您可能希望将服务器的公共 URL 添加到启用 CORS 的 origins

  • 您可以通过设置teamcity.csrf.origin.check.enabled=logOnly 内部属性来暂时禁用 CSRF 保护。

  • 有关失败的 CSRF 尝试的信息会记录到TeamCity/logs/teamcity-auth.log文件中。有关请求的更详细诊断,请启用debug-auth logging preset

尝试传入请求头-H 'Origin: http://localhost:8111'

于 2019-07-01T10:08:25.620 回答