Вопрос или проблема
Я пытаюсь создать задачу на Jenkins, используя java-клиент (https://github.com/jenkinsci/java-client-api), вызывая .createJob(String jobName, String configXml). Однако сервер Jenkins возвращает ошибку 403 запрещено.
Пример кода :
HttpClientBuilder builder = HttpClientBuilder.create();
JenkinsHttpClient client = new JenkinsHttpClient(uri, builder, "XXX", "XXX");
JenkinsServer jenkins = new JenkinsServer(client);
String sourceXML = readFile("src/main/resources/config.xml");
System.out.println(String.format("Установленная версия Jenkins >> %s", jenkins.getVersion().getLiteralVersion()));//работает и дает правильный результат
jenkins.createJob("test-nov1", sourceXML);
Теперь ошибка, которую я получаю :
Исключение в потоке "main" org.apache.http.client.HttpResponseException: код состояния: 403, причина: Запрещено
в com.offbytwo.jenkins.client.validator.HttpResponseValidator.validateResponse(HttpResponseValidator.java:11)
в com.offbytwo.jenkins.client.JenkinsHttpClient.post_xml(JenkinsHttpClient.java:375)
в com.offbytwo.jenkins.JenkinsServer.createJob(JenkinsServer.java:389)
в com.offbytwo.jenkins.JenkinsServer.createJob(JenkinsServer.java:359)
в com.hcl.OffByTwoJenkins.main(OffByTwoJenkins.java:31)
Безопасность сервера Jenkins :
Когда я выбираю “Любой пользователь может делать что угодно”, создание задачи проходит успешно. Однако, когда я выбираю “Вошедший пользователь может делать что угодно”, я получаю вышеуказанную ошибку. Более того, хотя я отправляю правильного пользователя и пароль, с разрешением на создание задачи (возможность создания задачи с помощью веб-интерфейса Jenkins).
Какие разрешения или изменения настроек необходимы для достижения этого.
Спасибо
Чтобы решить эту проблему, попробуйте снять галочку с “Предотвратить атаки межсайтовой подделки запросов” в разделе jenkins.com/configureSecurity и это начало работать.
Используйте токен API для создания JenkinsHttpClient, чтобы избежать этой проблемы.
JenkinsHttpClient jenkinsHttpClient = new JenkinsHttpClient(new URI("http://192.168.0.11:8080"),
"admin", "ваш токен API");
Вы можете сгенерировать токен API с панели управления Jenkins (Jenkins> Пользователи > Выберите пользователя> настройки > добавьте новый токен API).
Для меня использование true
для crumbFlag
помогло: например, вам следует вызывать jenkins.createJob("test-nov1", sourceXML, true);
вместо jenkins.createJob("test-nov1", sourceXML);
Ответ или решение
Ваша проблема с ошибкой 403 при попытке создать задание на сервере Jenkins через Java-клиент может быть решена с учётом нескольких важных аспектов, касающихся безопасности Jenkins и настроек аутентификации. Ниже приведены советы и решения, которые помогут устранить это препятствие.
1. Аутентификация и права доступа
Ошибки 403 "Forbidden" обычно указывают на недостаток прав пользователя для выполнения определённого действия. В вашем случае, если вы можете успешно создать задание в веб-интерфейсе Jenkins, но получаете ошибку через API, возможно, ваша система аутентификации работает не так, как вы ожидаете.
- Проверьте права пользователя: Убедитесь, что пользователь, от имени которого вы аутентифицируетесь, имеет необходимые разрешения для создания задания в Jenkins. Даже если у этого пользователя есть полномочия в интерфейсе, API может иметь свои ограничения.
2. Использование API токена
Когда Jenkins защищён, он также может потребовать использования API токена вместо использования пароля. Это более безопасный метод аутентификации и часто решает проблемы с доступом.
- Сгенерируйте API токен: Перейдите в раздел Jenkins > Пользователи > (Ваш пользователь) > Настройки и создайте новый API токен. Используйте его вместо пароля в вашем коде.
Пример кода с использованием API токена:
JenkinsHttpClient jenkinsHttpClient = new JenkinsHttpClient(new URI("http://192.168.0.11:8080"),
"admin", "ваш_токен_апи");
3. CSRF защиты
В Jenkins имеется механизм защиты от CSRF (Cross-Site Request Forgery), который может блокировать ваши запросы, если они не содержат специального токена (crumb). Если в настройках безопасностью установлен флаг "Prevent Cross Site Request Forgery exploits", вам нужно будет отправлять этот токен вместе с запросом.
- Установите crumbFlag: Попробуйте изменить ваш вызов создания задания, добавив
true
для параметраcrumbFlag
, что сигнализирует об использовании механизма защиты:
jenkins.createJob("test-nov1", sourceXML, true);
Это может решить вашу проблему, если ваша конфигурация требует наличия этого токена.
4. Настройки безопасности Jenkins
Если временно отключить защиту CSRF помогает, это может быть признаком того, что ваш запрос не содержит необходимых токенов. Однако рекомендуется не оставлять эту настройку отключённой для обеспечения безопасности вашего сервера Jenkins.
Окончательное решение может потребовать от вас понимания того, какие ограничения, установленные на сервере Jenkins, могут влиять на ваши API-вызовы.
Заключение
Решение проблемы с 403 Forbidden при использовании API Jenkins требует внимательного анализа прав пользователя, использования API токенов и решения проблем, связанных с CSRF. Следуйте описанным рекомендациям, и вы сможете удачно интегрировать клиентские запросы к вашему серверу Jenkins. Если после выполнения приведённых шагов проблема сохранится, не забудьте просмотреть журналы Jenkins для получения дополнительных подсказок о том, что может быть не так.