背景

生产环境Jenkins版本进行了升级,发现代码中直接使用http调用Jenkins REST API的方法失效了,都是同样的错误,No valid crumb was included in the request。
No valid crumb was included in the request 问题定位与解决

百度的结果

搜索了具体的错误信息,发现都是一样的,就是说把Jenkins的CSRF给关闭了,但是我在Jenkins上面没有找到关闭CSRF的入口。就像下面这张图。
No valid crumb was included in the request 问题定位与解决
然后百度得知,Jenkins高版本关闭了页面上面取消CSRF防护的入口,本来也不推荐关闭。

解决

  • 方法一
    这边我当时是想,既然说没有这个crumb,那我就在请求的时候生成这个crumb头,然后加上再去调用接口不就好了。但是当我加上这个头之后,还是报同样的错误,很头疼。方法一GG。
  • 方法二
    接口调用不了了,很急,就想到这个日志应该是Jenkins打印出来的,然后就去下载了Jenkins的源码,全局搜索了这个错误日志,果然搜索到了,还有一段解释。
    这段代码在core/src/main/java/hudson/security/csrf/CrumbFilter.java里面,这个类是一个过滤器,方法中具体的逻辑是判断crumb头是否合法,然后再进行放行操作。
    No valid crumb was included in the request 问题定位与解决
    这边到具体抛出问题的位置,然后看了下具体的日志,日志里面是说使用这种token来代替,然后打开后面的链接。
    No valid crumb was included in the request 问题定位与解决
    翻译大概是,CSRF的这个crumb头目前仅仅是对创建他们的Web会话有效,以限制攻击者的攻击。就是我们通过这个/crumbIssuer/api 获取到的crumb,除非是保存了Web会话信息,不然是无法调用CSRF保护的接口的。或者说使用API token,这种方式是不需要额外添加crumb头的。
    这么看,大概有两种方法可以解决这个问题。第一种是调用接口时,把会话信息带着,实现感觉有点复杂,没做。第二种,就是使用API token的方式,貌似可以,ok。

相关文章:

  • 2021-04-16
  • 2022-02-15
  • 2021-10-01
  • 2022-12-23
  • 2022-12-23
  • 2021-05-22
  • 2021-06-14
猜你喜欢
  • 2022-12-23
  • 2022-01-19
  • 2021-12-10
  • 2022-12-23
  • 2021-08-04
  • 2022-12-23
  • 2021-05-05
相关资源
相似解决方案