Jenkins订书机请求失败,没有有效的屑

时间:2019-07-11 06:57:44

标签: jenkins jenkins-plugins csrf hudson hudson-plugins

我正在开发Jenkins插件,现在陷入了试图获取here中所述方法的返回值的问题。

我只想调用此kotlin方法:

@JavaScriptMethod
fun getMonitoredJobsAsJSON(): JSONArray = toJSON(getObjectMapper().writeValueAsString(getMonitoredJobs())) as JSONArray

从果冻脚本中使用以下命令:

<script>
  var board = <st:bind value="${it}"/>

  board.getMonitoredJobsAsJSON(function(data) {
   //
  })
</script>

当我在Jenkins服务器上禁用CSRF保护时,这实际上有效,但是我显然不想这样做。启用CSRF保护后,我始终找不到无效的碎屑403错误:

POST http://localhost:8080/$stapler/bound/36dc05fc-c12d-4182-a008-60bcf5c49307/getMonitoredJobsAsJSON 403 (No valid crumb was included in the request)

我知道如何从crumbIssuer端点检索碎屑以便与Jenkins rest api进行交互,但是我几乎没有发现有关如何使其适用于插件中的装订器请求的资源。

此外,当我检查请求时,实际上在请求中设置了一个屑头: enter image description here

在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

几周后,我终于找到了解决方案。

问题是由于某种原因,默认情况下附加到请求的面包屑标头的名称实际上是错误的。如我问题中的屏幕快照所示,它是SELECT id, name FROM test.user WHERE id between 1 and 3 UNION SELECT id, name FROM test.user WHERE id between 5 and 6 ,但对于较早版本的Jenkins,实际上应该为CrumbJenkins-Crumb

我要做的是找到一种方法,当页面最初加载时,从服务器中检索面包屑和正确的标头名称,然后使用正确的名称将此面包屑标头附加到任何后续标头中xhr请求。

我为面包屑定义了一个实体:

.crumb

然后将此实体作为属性添加到插件:

class RemoteRequestCrumb {
    @JsonIgnore private val crumbIssuer: CrumbIssuer? = Jenkins.getInstance()?.getCrumbIssuer()
    val fieldName: String? = crumbIssuer?.crumbRequestField
    val crumbValue: String? = crumbIssuer?.crumb
}

现在,您可以像其他任何插件属性fun getRemoteRequestCrumb(): JSONObject = toJSON( SerializationUtils.getObjectWriter().writeValueAsString(RemoteRequestCrumb()) ) as JSONObject 一样,从果冻脚本中请求面包屑数据。

最后一步实际上是将正确的标头附加到所有XHR请求:

${it.getRemoteRequestCrumb()}