API REST Публикация двух запросов одновременно с разными свойствами завершается неудачно с кодом состояния 403 из-за проверки CSRF

Отправляю два почтовых запроса с использованием REST API: http://localhost:8111/app/rest/buildQueue, но мой второй запрос завершается неудачно с 403 Запрещено: Ответ с кодом состояния 403 из-за неудачной проверки CSRF: нет заголовка "Происхождение" присутствует и аутентификация не предусмотрена в запросе, рассмотрите возможность добавления заголовка "Origin: http://localhost:8111/". Мне интересно, почему это происходит, так как, если я запускаю сборку в пользовательском интерфейсе и изменяю параметры ex. build1 имеет%version=2%, а build2 имеет%version=3%, он будет работать параллельно друг с другом на разных доступных агентах.

Вот мой JSON-запрос, который я отправляю

API REST: http://localhost:8111/app/rest/buildQueue JSON BODY:

{"branchName": "master", "buildType": {"id": "DockerBuild", "projectId": "Test"}, "properties": {"property": [{"name": "DOCKER_IMAGE_NAME", "value": "test-3"}, {"name": "SNAPSHOT_DEPENDENCY_VERSION", "value": "0.6"}]}}

Я пропускаю параметр, чтобы иметь возможность запустить сборку параллельно друг с другом?

403 Запрещено: Ответ с кодом состояния 403 из-за неудачной проверки CSRF: заголовок "Origin" отсутствует и аутентификация не предоставлена ​​в запросе, рассмотрите возможность добавления заголовка "Origin: http://localhost:8111/".

4 ответа

Решение

Когда вы сталкиваетесь с проблемами, связанными с защитой CSRF в TeamCity (например, вы получаете ответ "Ответ с кодом состояния 403 из-за неудачной проверки CSRF" от сервера), вы можете выполнить следующие действия:

  • Если вы используете обратный прокси-сервер, убедитесь, что вы правильно настроили заголовки Host/Origin, как описано выше. Тем временем вы можете добавить общедоступный URL-адрес вашего сервера к источникам с поддержкой CORS.

  • Вы можете временно отключить защиту CSRF, установив внутреннее свойство teamcity.csrf.origin.check.enabled=logOnly.

  • Информация о неудачных попытках CSRF регистрируется в файлах TeamCity/logs/teamcity-auth.log. Для более подробной диагностики запросов включите предустановку ведения журнала debug-auth.

Попробуйте передать в заголовок запроса -H 'Origin: http://localhost:8111'

Возможно, это может быть полезно для кого-то, у меня такая же ошибка с одним POST с помощью Postman:

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.

Итак, я выполнил рекомендацию сообщения об ошибке и в заголовке добавил "Origin" со значением " http://teamcity:20011/ ", и это устранило проблему. Кстати, в авторизации я выбрал "Bearer Token" и вставил токен, сгенерированный ранее через TeamCity. Это призыв:

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

Я просто тестировал, как запустить сборку с помощью API, и это сработало. Теперь следующий шаг - реализовать этот вызов с помощью JavaScript.

Запросите заголовок CSRF с соответствующим запросом: https://teamcity/authenticationTest.html? Csrf

и установите его в заголовке "X-TC-CSRF-TOKEN" вашего запроса POST.

Если вы укажете токен доступа к заголовку запроса, напримерAuthorization: Bearer ..., вам не нужно указывать токен CSRF, и вы действительно должны проверить, не отправляете ли вы файлы cookie.

Это от разработчика в JetBrains:

Если вы используете аутентификацию на основе токенов, не должно быть необходимости предоставлять заголовок токена CSRF и получать его с помощью вызова authenticationTest.html. В этом сценарии ожидается, что в HTTP-запросе нет файлов cookie сеанса (в противном случае TeamCity попытается найти токен).

То есть, по сути, вы должны иметь возможность выполнять HTTP-запрос без сеанса, предоставляя только заголовок Authorization: Bearer {{token}}.

https://youtrack.jetbrains.com/issue/TW-69566/Flaky-builds-with-CSRF-Header-X-TC-CSRF-Token-does-not-match-CSRF-session-value#focus=Comments-27-4644138.0-0

Ну, ошибка и документация, похоже, этого не объясняют...

Другие вопросы по тегам