Jenkins: 403 No valid crumb was included in the request
Asked Answered
A

30

108

I configured Jenkins in Spinnaker as follows and setup the Spinnaker pipeline.

 jenkins:
    # If you are integrating Jenkins, set its location here using the baseUrl
    # field and provide the username/password credentials.
    # You must also enable the "igor" service listed separately.
    #
    # If you have multiple Jenkins servers, you will need to list
    # them in an igor-local.yml. See jenkins.masters in config/igor.yml.
    #
    # Note that Jenkins is not installed with Spinnaker so you must obtain this
    # on your own if you are interested.
    enabled: ${services.igor.enabled:false}
    defaultMaster:
      name: default
      baseUrl: http://server:8080
      username: spinnaker
      password: password

But I am seeing the following error when trying to run the Spinnaker pipeline.

Exception ( Start Jenkins Job ) 403 No valid crumb was included in the request

Aftercare answered 23/6, 2017 at 1:26 Comment(0)
I
99

Finally, this post helped me to do away with the crumb problem, but still securing Jenkins from a CSRF attack.

Solution for no-valid crumb included in the request issue

Basically, we need to first request for a crumb with authentication and then issue a POST API calls with a crumb as a header along with authentication again.

This is how I did it,

curl -v -X GET http://jenkins-url:8080/crumbIssuer/api/json --user <username>:<password>

The response was,

{
"_class":"hudson.security.csrf.DefaultCrumbIssuer",
"crumb":"0db38413bd7ec9e98974f5213f7ead8b",
"crumbRequestField":"Jenkins-Crumb"
}

Then the POST API call with the above crumb information in it.

curl -X POST http://jenkins-url:8080/job/<job-name>/build --user <username>:<password> -H 'Jenkins-Crumb: 0db38413bd7ec9e98974f5213f7ead8b'
Inclinatory answered 18/2, 2019 at 15:30 Comment(6)
Does the curl statement work with the credential ID instead of the username then password? Thank youAnabolite
The crumbIssuer should not be used for scripts anymore, see jenkins.io/redirect/crumb-cannot-be-used-for-scriptPlash
The crumbIssuer CAN still be used, there's just change in behavior - it now requires preservation of session too. Unless you can use the same session between your scripted requests, you must move to a TOKEN auth.Antoineantoinetta
The link in the post is not valid anymore.Marlea
without username and password: curl -X POST 'http://localhost:8090/configuration-as-code/export' -H "Jenkins-Crumb:$(curl -s -X GET http://localhost:8090/crumbIssuer/api/json | python3 -c 'import sys, json; print(json.load(sys.stdin)["crumb"])')" -vThyroiditis
This almost got me to where I needed to be, but I also needed to set a cookie value that was being returned from the crumb api. Make sure to consume the cookie values and send them as requested.Urease
P
86

This solution is safe to use

We came along this issue when we changed Jenkins to be accessible via a reverse proxy.

There is an option in the "Configure Global Security" that "Enable proxy compatibility"

This helped with my issue.

Enter image description here

Another solution

In the GitHub payload URL, make your URL look like this: https://jenkins:8080/github-webhook/

Don’t forget to mention / at the end.

Phototelegraphy answered 16/5, 2019 at 11:19 Comment(1)
Just a site note about what I've figured out: 1. Access this site via JENKINS_URL/manage 2. This applies when you use Jenkins behind an nginx proxy.Concern
A
42

I solved this by using an API token as a basic authentication password. Here is how:

curl -v -X POST http://jenkins-url:8080/job/<job-name>/buildWithParameters?param=value --user <username>:<token>

Note: To create the API token under the accounts icon → ConfigureAPI TokenAdd New token.

Aviary answered 31/7, 2020 at 12:3 Comment(4)
API tokens are preferred instead of crumbs for CSRF protection : from jenkins.io/doc/book/using/remote-access-apiAlbite
This needs to be way way up. CSRF was not letting me use the token by itself. This answer told me to use --user <username>:<token>. Where were you all my life?Hogen
If using a Jenkins freestyle job, you still need to enable This project is parameterized and add at least 1 parameter. Also note the CURL request works without enabling Trigger builds remotely because you are using the API Token rather than a CSRF token (crumb).Moonset
This should be the correct answer. Don't inject CSRF headers into API calls or disable CSRF altogether, that's not how anything works.Claudeclaudel
A
38

To resolve this issue I unchecked "Prevent Cross Site Request Forgery exploits" in jenkins.com/configureSecurity section and it started working.

Prevent Cross Site Request Forgery exploits

Aftercare answered 24/6, 2017 at 4:19 Comment(5)
Disabling this reduces security of your Jenkins installation, don't do this blindly.Tellurite
could you suggest an alternative way that would solve this issue and not create a security risk? @TelluriteGreensand
I had the same problem with Jenkins 2.190.1 and I found the solition on cloudbees site. It's very important that the request that get the crumb and the one that use this crumb be in the same session (use the same session cookie). That's solved my problemHoneyhoneybee
Santosh answer is much safier.Singspiel
You can no longer disable this setting. The check box does not appear in Jenkins v2.303Goatee
B
28

A crumb is nothing but an access token. Below is the API to get the crumb:

https://jenkins.xxx.xxx.xxx/crumbIssuer/api/json // Replace it with your Jenkins URL and make a GET call in your Postman or REST API caller.

This will generate output like:

{
    "_class": "hudson.security.csrf.DefaultCrumbIssuer",
    "crumb": "ba4742b9d92606f4236456568a",
    "crumbRequestField": "Jenkins-Crumb"
}

Below are more details and link related to same: How to request for the crumb issuer for Jenkins

Jenkins wiki page.

If you are calling the same via REST API call, checkout the below link where it is explained how to do a REST call using jenkins-crumb.

https://blog.dahanne.net/2016/05/17/how-to-update-a-jenkins-job-posting-config-xml/

Example:

curl -X POST http://anthony:anthony@localhost:8080/jenkins/job/pof/config.xml --data-binary "@config.xml" -data ".crumb=6bbabc426436b72ec35e5ad4a4344687"
Bantam answered 23/6, 2017 at 6:47 Comment(5)
@Aftercare : Did that work or you are still facing issues ?Bantam
I am trying to configure this with spinnaker. Curl request works but its not working with spinnaker configuration.Aftercare
Accessing directly in the browser to /crumbIssuer/api/json got me back on track.Embolden
HTTP GET requests to this endpoint fail with a 404 on Jenkins 2.84.Dodiedodo
This is what I needed to make API call from the browser userscript. (for some reason the button to stop a build dissappeared in our UI)Quadruplet
G
23

For the new release of Jenkins you should follow the solution below:

From Upgrading to Jenkins 2.176.3:

Upgrading to Jenkins 2.176.2 Improved CSRF protection

SECURITY-626

CSRF tokens (crumbs) are now only valid for the web session they were created in to limit the impact of attackers obtaining them. Scripts that obtain a crumb using the /crumbIssuer/api URL will now fail to perform actions protected from CSRF unless the scripts retain the web session ID in subsequent requests. Scripts could instead use an API token, which has not required a CSRF token (crumb) since Jenkins 2.96.

To disable this improvement you can set the system property hudson.security.csrf.DefaultCrumbIssuer.EXCLUDE_SESSION_ID to true. Alternatively, you can install the Strict Crumb Issuer Plugin which provides more options to customize the crumb validation. It allows excluding the web session ID from the validation criteria, and instead e.g. replacing it with time-based expiration for similar (or even better) protection from CSRF

In my case, it helped for the installation of the Strict Crumb Issuer Plugin, rebooting Jenkins and applying a less strict policy for the web interface of Jenkins as it is suggested on the vendor's site.

Gizzard answered 11/3, 2020 at 10:20 Comment(3)
Thanks for sharing this. I also used the Strict Crumb Issuer Plugin to go around this problem.Dwanadwane
I now use the same session to talk to Jenkins after requesting the crumb, which solved the issue. Didn't need to install the plugin.Emilioemily
This solution worked for me too. For help with creating a System Property, please follow medium.com/the-devops-ship/…Athallia
H
10

According to Jenkins Directive First you have to check your Jenkins version if the version is < 2.176.2 then per Jenkins guideline CSRF tokens (crumbs) are now only valid for the web session they were created in to limit the impact of attackers obtaining them. Scripts that obtain a crumb using the /crumbIssuer/api URL will now fail to perform actions protected from CSRF unless the scripts retain the web session ID in subsequent requests.

Alternatively, you can install the Strict Crumb Issuer Plugin which provides more options to customize the crumb validation. It allows excluding the web session ID from the validation criteria, and instead e.g. replacing it with time-based expiration for similar (or even better) protection from CSRF.

Steps :

  • you have to installed the plugin called "Strict Crumb Issuer"
  • Once installed restart the jenkins service
  • got to "Manage Jenkins" --> "Configure Global Security" --> Under CSRF Protection, select "Strict Crumb Issue" from the drop down list --> Click on Advance and uncheck everything but select "Prevent Breach Attack" option. --> Apply and save.
  • Now run you crumb script.

It should work now.

Check this image for your reference

Highoctane answered 17/7, 2020 at 16:3 Comment(1)
This one fixed my 403 issueAntwanantwerp
R
8

You need a two-step procedure to first get a crumb from the server and then use it.

I am using this Bash script and cURL for that:

#!/bin/bash
# buildme.sh    Runs a build Jenkins build job that requires a crumb
# e.g.
# $ ./buildme.sh 'builderdude:monkey123' 'awesomebuildjob' 'http://paton.example.com:8080'
# Replace with your admin credentials, build job name and Jenkins URL
#
# More background:
# https://support.cloudbees.com/hc/en-us/articles/219257077-CSRF-Protection-Explained

USERPASSWORD=$1
JOB=$2
SERVER=$3

# File where web session cookie is saved
COOKIEJAR="$(mktemp)"
CRUMB=$(curl -f -u "$USERPASSWORD" --cookie-jar "$COOKIEJAR" "$SERVER/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,%22:%22,//crumb)")
status=$?
if [[ $status -eq 0 ]] ; then
  curl -f -X POST -u "$USERPASSWORD" --cookie "$COOKIEJAR" -H "$CRUMB" "$SERVER"/job/"$JOB"/build
  status=$?
fi
rm "$COOKIEJAR"
exit $status

Here is an example of executing this script with the parameters you need:

./buildme.sh 'builderdude:monkey123' 'awesomebuildjob'

Output:

'http://paton.example.com:8080'

This script will return an error code if one of the cURL command fails for any reason.

More details can be found from cloudbees.

Rinehart answered 9/3, 2021 at 18:13 Comment(0)
I
5

I did get the same "403 No valid crumb was included in request" error when I created a Jenkins job from a Java program using jenkins-client library, i.e., com.offbytwo.jenkins. Then I used the Jenkins API token instead of password in the following code. Now, the issue is fixed.

JenkinsServer jServer = new JenkinsServer(new URI(jenkins_url), jnkn_username, jnkn_password);

We can generate an API token from the Jenkins console. Profile → ConfigureAPI Token (Add new token).

The same API token can also be used instead of a password with curl.

curl -v -X POST http://jenkins-url:port/job/<job-name>/buildWithParameters?param=value --user <jen_username>:<jenkins_api_token>
Itin answered 14/2, 2020 at 6:16 Comment(2)
Thanks! I replaced password with api token in phabricator post request to jenkins and it helpedBrenza
This answer should be IMHO the preffered solution for Jenkins API calls in general.Aeromancy
D
5

I lost a bunch of time trying to figure this out. At the end, I just installed the plugin Build Authorization Token Root and enabled build permissions to anonymous users.

At the end doesn't really matter, because the Jenkins instance is behind a VPN and I'm using https://smee.io to forward the webhook to the Jenkins instance.

Also the Jenkins instance is behind a reverse proxy, so the "Enable proxy compatibility" option is checked as well, and the "ignore_invalid_headers" setting set to off in the Nginx configuration at the server level. I am sharing my solution just in case someone else is struggling as well. I'm sure there are better ways to do it, but this is one option.

Note that with this plugin the build URL is set to buildByToken/build?job=JobName&token=TokenValue and the token is generated in the job settings.

This is in Jenkins 2.235.2 which doesn't have an option to disable CSRF.

Downcome answered 30/7, 2020 at 21:9 Comment(1)
Installing the "Build Authorization Token Root Plugin" in Jenkins solved my problem as well (my phabricator HTTP request could not trigger Jenkins build).Syllepsis
B
3

Since this question is the first SO link when searching for "No valid crumb was included in the request" in Google, I think it's worth mentioning that the same error is generated if you omit/forget the Authorization HTTP header or use a blank username/password:

Screenshot showing error with omitted Authorization HTTP header

Relevant error messages related to the Authorization header are only generated when a value is passed:

Screenshot showing errors related to the Authorization header

And, yes, the crumb passed in the first screenshots is actually valid; everything works with the correct username/password:

Screenshot showing the crumb used earlier is valid

So, not sure if that's a bug or not, but "No valid crumb was included in the request" could also mean you accidentally forgot the Authorization header.

Jenkins 2.222.3, Ubuntu Server 20.04, Java Runtime 1.8.0_252-8u252-b09-1ubuntu1-b09

Brute answered 22/5, 2020 at 7:25 Comment(0)
B
2

I had the same issue while using a GitLab webhook with a Jenkins Multibranch pipeline.

On the GitLab webhook page, I changed the Jenkins job URL base path word job to project, as I found on in this link:

From: http://127.0.0.1:8080/job/user-test-repo

To: http://127.0.0.1:8080/project/user-test-repo

Botzow answered 9/10, 2022 at 0:49 Comment(0)
M
1

Here is my solution to this issue (Git hooks to launch a Jenkins job behind a reverse proxy).

  1. Get the crumb from a first call and store the sessionid in a cookie jar:

     CRUMB=$(/usr/bin/curl --cookie-jar ./cookie -sX GET https://******.net/crumbIssuer/api/json|cut -d'"' -f8)
    
  2. Launch the job:

     /usr/bin/curl --cookie ./cookie -X POST https://******.net/job/PROJECTNAME/build -H "Jenkins-Crumb: $CRUMB"
    
Magnetograph answered 4/2, 2021 at 11:9 Comment(0)
D
1

For me, the below solutions work in Bitbucket:

I updated the URL to:

http://jenkinsurl:8080/bitbucket-hook/

Bitbucket Webhook:

Edit webhook

Durfee answered 14/3, 2022 at 14:4 Comment(1)
which plugin is that?Loge
A
0

For Java code to access the Jenkins API I will let my advise out.

The answer of Santhosh does resolve the problem. That consists in changing the password for a token, but as far as I know, the token is now a legacy manner to do it. So I tried other way, and find out a solution inside Java code.

Here how I did it.

In my Java code I use the com.offbytwo.jenkins package and the class that I use is JenkinsServer.

My problem was to create a job in Jenkins because I was getting an error: "403 No valid crumb was included in request"

Then I found a Boolean parameter called crumbFlag and passed true on it and everything worked.

My code was like this:

jenkins.createJob(job.getName(), config);

Then, I changed for this, and it worked like a charm:

jenkins.createJob(job.getName(), config, true);

This parameter is inside almost all methods of this package, by example:

  • createJob(String jobName, String jobXml, Boolean crumbFlag)
  • updateJob(String jobName, String jobXml, boolean crumbFlag)
  • renameJob(String oldJobName, String newJobName, Boolean crumbFlag)
  • Others.

The technical documentation inside the code is:

@param crumbFlag true to add crumbIssuer * false otherwise.

I understood if you pass true for this parameter it will issue a crumb automatically.

Well, the official documentation has this information in detail. If you wish, take a look here:

Class JenkinsServer

Amphiaster answered 7/10, 2020 at 13:44 Comment(0)
T
0

I had the same issue when trying to set up a GitHub project with the GitHub Pull Request Builder plugin.

  • Here is an example of the response I was getting from my Jenkins server

    Enter image description here

  • Response content

    Enter image description here

  • The problem was happening because my payload URL was missing a forward slash at the end, /.

  • adding a forward slash at the end of the URL solves the problem

  • your payload URL should look like this: https://jenkins.host.com/ghprbhook/

  • Examples after adding the forward slash

    Enter image description here

    Enter image description here

Trucking answered 26/1, 2021 at 9:17 Comment(0)
C
0

For me the solution was to pass the X-Forwarded-Host and X-Forwarded-Port headers as suggested in the reverse-proxy-configuration-troubleshooting chapter of the Handbook.

HaProxy config, inside the frontend section:

http-request set-header  X-Forwarded-Host  %[hdr(host)]
http-request set-header  X-Forwarded-Port  %[dst_port]
Corolla answered 22/4, 2021 at 9:59 Comment(0)
C
0

I also faced a similar problem. I was using a password instead of a token.

When updated, it solved my problem. There isn't any need to uncheck anything and make it insecure. Below are the complete steps that I followed to have Jenkins CLI working:

Step 1: Prepare environment variables

export JENKINS_URL=http://localhost:8080/
export JENKINS_USER=admin
export JENKINS_PASSWORD=b7f04f4efe5ee117912a1.....
export JENKINS_CRUMB=f360....
export FOLDER=test

Obtain a token as: How to get the API token for Jenkins

Get the crumb as: http://localhost:8080/crumbIssuer/api/json

Step 2: Prepare the XML file, file name creds.xml

<com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl>
  <scope>GLOBAL</scope>
  <id>TEST-CLI</id>
  <username>test</username>
  <password>test123</password>
  <description>this secret if created confirms that jenkins-cli is working</description>
</com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl>

Step 3: POST using cURL

curl -X POST -u $JENKINS_USER:$JENKINS_PASSWORD -H "Jenkins-Crumb:${JENKINS_CRUMB}" -H 'content-type:application/xml' -d @creds.xml "$JENKINS_URL/job/$FOLDER/credentials/store/folder/domain/_/createCredentials"
Crinum answered 19/5, 2021 at 11:38 Comment(0)
D
0

Visiting Jenkins with https://... instead of http://... solved the problem for me.

Driftage answered 2/9, 2021 at 8:54 Comment(0)
U
0

In my case, I was able to bypass the error by using Remote Desktop into the Jenkins server directly and using a localhost-based URL instead of trying to go through the corporate proxy from my computer.

Unteach answered 5/5, 2022 at 16:59 Comment(0)
R
0

When I was trying to build a job in Jenkins by following options like build steps, accessing Git code, whatever the options, etc., I faced the error

jenkins-403-no-valid-crumb-was-included-in-the-request

Seriously, I tried a number of ways to resolve it... But there wasn't any luck...!

Surprisingly, I changed my Wi-Fi network, and then it worked.

Registered answered 13/10, 2022 at 19:25 Comment(0)
S
0

In case it helps someone, from the documentation: "This message can also appear if you don’t access Jenkins through a reverse proxy: Make sure the Jenkins URL configured in the System Configuration matches the URL you’re using to access Jenkins"

I had checked my nginx reverse proxy configuration, tried the Strict Crumb, but for whatever reason, even when accessing Jenkins using its IP and port, I would have that issue, after updating the URL to be http://: , saving, and then back to the final url, it's working again

Sarsaparilla answered 23/2, 2023 at 9:27 Comment(0)
S
0

I have to just refresh the page . This error can come when the browser tab with oped jenkins configuration turn stale or has been ope for long time.

Shears answered 13/4, 2023 at 9:31 Comment(0)
B
0

for setting up miniOrange saml

the 403 missing breadcrumb can happen if the ACS and Saml Audience urls are incorrect, specifically pointed at the /manage routes that require authentication.

I had a Jenkins instance auto-configure itself with a baseurl of https://myjenkins.example.org/manage/ which generated ACS and Audience urls of the incorrect:

https://myjenkins.example.org/manage/securityRealm/moSamlAuth

Instead of correct:

https://myjenkins.example.org/securityRealm/moSamlAuth

Backpedal answered 19/7, 2023 at 23:14 Comment(0)
S
-1

First create a user API token by going to userAPI TokenAdd new token.

Then use the below script for triggering.

import jenkins,requests

job_name='sleep_job'
jenkins_url = "http://10.10.10.294:8080"
auth = ("jenkins","1143e7efc9371dde2e4f312345bec")
request_url = "{0:s}/job/{1:s}/buildWithParameters".format(jenkins_url,
job_name, )
crumb_data = requests.get("{0:s}/crumbIssuer/api/json".format(jenkins_url),
auth=auth, ).json()
headers = {'Jenkins-Crumb': crumb_data['crumb']}
jenkins_job_params={}
jenkins_job_params['NODE_NAME']='10_10_1_29'
jenkins_job_params['SLEEP_TIME']='1h'
response = requests.post(request_url, data=jenkins_job_params, auth=auth, )
response.raise_for_status()
Swordplay answered 26/10, 2020 at 10:26 Comment(1)
What programming language? JavaScript?Histology
F
-1

I followed this comment: In DashboardManage JenkinsConfigure Global Security. Under CSRF Protection, choose option Enable proxy compatibility. It works for me.

Florri answered 18/11, 2022 at 9:10 Comment(0)
W
-1

I saw someguy did on KodeKloud and the webhook link was

https://PROJECT_URL/buildByToken/build?job=<job_name>&token=<token_name>

. Worked out for me !

Wallop answered 4/11, 2023 at 3:52 Comment(0)
W
-2

Head over to Manage Jenkins => Configure global security.

Then uncheck "Prevent Cross Site Request Forgery exploits"

Whimper answered 30/8, 2019 at 21:3 Comment(0)
K
-2

I am running with a reverse proxy with nignx. I changed a Jenkins option in the "Configure Global Security", that "Enable proxy compatibility".

This fixed with my issue.

Kaye answered 9/8, 2020 at 17:38 Comment(0)
J
-5

I have run into the same issue. I have only refreshed my browser, logged back in to Jenkins, did the same process and everything worked.

Jilljillana answered 5/3, 2020 at 16:58 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.