【问题标题】:Jenkins 2.192: HTTP Error 403: No valid crumb was included in the requestJenkins 2.192:HTTP 错误 403:请求中没有包含有效的碎屑
【发布时间】:2021-10-07 01:01:41
【问题描述】:

我最近升级到 Jenkins 2.192,我的应用程序开始失败并出现以下错误:

HTTP Error 403: No valid crumb was included in the request
Reason: No valid crumb was included in the request

降级到 Jenkins 2.189 后我没有看到问题。 我没有看到 Jenkins 2.189、2.190、2.191 的问题。 我在 Jenkins 2.192 中遇到了这个问题(也可以在 2.196 中看到)

在 2.191 和 2.192 之间发生了一些变化,导致了我观察到的故障。

【问题讨论】:

    标签: jenkins


    【解决方案1】:

    您现在必须在每次使用该 crumb 时转发会话 ID(存在于生成该 crumb 的 cookie 响应中)。示例代码,希望能说明这一点:

    async function duplicateProject() {
      const jenkinsAxios = axios.create({
        baseURL: 'http://jenkins_url',
        auth: {
          username: 'MY-USERNAME',
          password: "MY-PASSWORD"
        }
      });
    
      const {data: existingJobConfig} = await jenkinsAxios.get('/job/existingJob/config.xml');
    
      const crumbIssuer = await jenkinsAxios.get('/crumbIssuer/api/json');
    
      await jenkinsAxios.post(`/createItem?name=MY_NEW_PROJECT`, existingJobConfig, {
          headers: {
            'Content-Type': 'application/xml',
            [crumbIssuer.data.crumbRequestField]: crumbIssuer.data.crumb,
            Cookie: crumbIssuer.headers['set-cookie'][0]              // <--- THIS IS KEY!!!!
          }
        }
      );
    }
    

    【讨论】:

    • 这对于希望自动化 jenkins 作业构建流程的后端开发人员来说非常有用。我认为应该有更高的票数
    • 这很重要,谢谢。花了几个小时试图找出错误,尝试了 u/p、token 的各种组合,将它放在数据而不是标题中,但直到我找到它才失败。
    【解决方案2】:

    无需更改源代码的简单解决方案(已通过 Jenkins v2.222 验证):

    1. 安装 Strict Crumb Issuer 插件 (https://plugins.jenkins.io/strict-crumb-issuer/)
    2. 启用此插件并从其配置中取消选中“检查会话 ID”(在 Jenkins 下配置全局安全性)

    一个缺点是这个解决方案使我们依赖于 Strict Crumb Issuer 插件并删除了一个安全功能。但由于我们的应用程序需要许多其他插件,并且只能在没有 Internet 访问的情况下运行在防火墙后面,所以这是可以接受的。

    【讨论】:

    • 不要忘记取消选中“高级”下的“检查会话 ID”。它工作正常
    • 仍然遇到同样的问题
    【解决方案3】:

    参考 - https://support.cloudbees.com/hc/en-us/articles/219257077-CSRF-Protection-Explained

    如果您使用用户名和用户 API 令牌进行身份验证,则 Jenkins 2.96 每周/2.107 LTS 不需要 crumb。有关更多信息,请参阅使用 API 令牌进行身份验证时不再需要 CSRF crumb 或 JENKINS-22474。

    【讨论】:

    【解决方案4】:

    在浏览了几篇文章后,我找到了一种解决方法...

    步骤:-1

    转到 Jenkins 并在 Jenkins 中为登录的用户创建一个令牌

    复制令牌和用户 ID

    user id: admin
    token id :- "*****"
    

    第二步:-

    使用以下命令创建碎屑

    wget -q --auth-no-challenge --user admin --password "ur jenkins password" --output-document - 'http://urljenkinsurl:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'
    

    这里的输出将是你的碎屑,例如:- "Jenkins-Crumb:****************"

    第三步:-

    在 Jenkins “Strict Crumb Issuer Plugin”中安装插件

    第四步:-

    转到BitBucket并输入网址

    http://admin:"your Jenkins token created in the above step"@3.22.23.32:8080/job/ur Job-name/build?crumb="created in the step 2"
    

    第 5 步:-

    转到您的 Jenkins 作业,转到配置--> 选择 --> 使用 BitBucket Push and Pull Request Plugin 构建。

    填写允许的分支:- /*

    eg:- /*master 分支

    第 6 步:-

    就是这样,现在尝试推送到 master 分支,将会看到构建被触发。

    注意:- 请在所有步骤中删除“”并替换为您的值

    【讨论】:

    • 以上步骤都试过了,还是403错误
    【解决方案5】:

    在 API 调用中传递 crumb 既简单又安全得多。 https://support.cloudbees.com/hc/en-us/articles/219257077-CSRF-Protection-Explained 解释了一切。

    另请参阅Ansible jenkins_plugin module returns "HTTP Error 403: No valid crumb was included in the request",了解 Jenkins 中 crumb 处理的最新变化。

    【讨论】:

      【解决方案6】:

      升级到此版本后,我在使用 VSTS 代理从 TFS 排队 jenkins 任务时遇到了同样的问题。

      您可以通过在 Jenkins Server 中禁用 CSRF 安全性来临时解决此问题。

      刚刚找到这个,可能会有所帮助: https://jenkins.io/doc/upgrade-guide/2.176/

      【讨论】:

      • CSRF 仍然适用于较旧的 Jenkins。我更喜欢使用旧版本启用它,而不是使用最新版本禁用它:-)
      【解决方案7】:

      2021 年 10 月。

      除了@acdcjunior 的“Cookie”提示之外,如果您使用用户名/密码获取 crumb,则需要将它们作为 auth 发送。在这种情况下,您不需要令牌。

      【讨论】:

        猜你喜欢
        • 2019-04-03
        • 1970-01-01
        • 1970-01-01
        • 2017-10-19
        • 2021-05-22
        • 1970-01-01
        • 2018-04-15
        • 1970-01-01
        • 2018-11-28
        相关资源
        最近更新 更多