【问题标题】:How to run a Jenkins job from classic ASP?如何从经典 ASP 运行 Jenkins 作业?
【发布时间】:2019-06-28 15:30:34
【问题描述】:

我已经到处搜索,但找不到 VBscript 示例,我所有的尝试都失败了。我需要从经典的 ASP 网页 (VBScript) 运行 Jenkins 作业。我可以使用下面的代码提交作业,但它返回 403 crumb 错误。我需要做的是为这项工作提供用户/密码(我有),但我不知道如何在 VBScript 中为 Jenkins 设置身份验证。我知道碎屑错误是由 CSRF 引起的(我读了很多,但无法将其关闭),并希望身份验证能解决这个问题。任何帮助深表感谢。提前致谢。

Dim strJenkinsURL, HttpReq
strJenkinsURL = "http://<jenkinsmaster>/job/<myjob>/buildWithParameters?token=test&Description="& strDesc &"&TestEnv="& testEnv

Set HttpReq = Server.CreateObject("MSXML2.ServerXMLHTTP")
HttpReq.Open "POST", strJenkinsURL, False
HttpReq.Send
Response.Write "<br>Status: "& HttpReq.Status & vbNewline
Response.Write "<br>Response: "& HttpReq.responseText & vbNewline

编辑: 基于 cmets,我尝试添加 Jenkins 登录信息,但仍然收到来自 Jenkins 的 403 crumb 错误。我已经尝试寻找获取面包屑的解决方案,但没有找到任何 VBScript 示例。这是我现在正在尝试的代码和响应,但我不知道 setRequestHeaders 是否适用于 Jenkins,并且 Jenkins 文档没有任何帮助:

Dim strJenkinsURL
strJenkinsURL = "http://<jenkins master>/job/testjob/buildWithParameters?token=test&Description="& strDesc &"&TestEnv="& testEnv

Set HttpReq = Server.CreateObject("MSXML2.ServerXMLHTTP")
HttpReq.Open "POST", strJenkinsURL, False
HttpReq.setRequestHeader "UserName", "jenkinsuser"
HttpReq.setRequestHeader "Password", "userpassword"
HttpReq.setRequestHeader "Jenkins-Crumb", "<crumbvalue>"
HttpReq.Send
Response.Write "<br>Status: "& HttpReq.Status & vbNewline
Response.Write "<br>Response: "& HttpReq.responseText & vbNewline

状态:403 响应:HTTP 错误 403 访问 /job/testjob/buildWithParameters 时出现问题。原因:请求中没有包含有效的面包屑

【问题讨论】:

  • 为了验证错误是否在您的 vbscript 中,请尝试使用 curl 或 postman。与我们分享结果
  • VBScript 中没有代码错误。我需要知道如何将身份验证添加到 POST to Jenkins API 的问题。由于 CRSF 保护,403 错误来自 Jenkins。如果我可以在 POST 请求中添加登录身份验证,我认为这会像 curl 示例中一样解决它,其中显示 --user USER:PASSWORD。但是对于您使用 curl 的建议,即使在 Jenkins Remote API 页面上的多个示例和我搜索过的其他内容之后,我也无法格式化甚至可以连接到 Jenkins URL 的 curl 命令。
  • @PondScum 您需要了解需要设置哪些标头以及如何计算它们的值,您应该从the documentation 获得这些信息。
  • “我知道 crumb 错误是由 CSRF 引起的(我读了这么多,无法关闭它),希望身份验证能解决这个问题。” - 真的不应该。 CSRF 攻击是指某个其他站点 让浏览器请求对被攻击的站点(即本例中的 Jenkins)执行某些操作,并使用存储在浏览器中的凭据使其工作。

标签: jenkins vbscript asp-classic


【解决方案1】:

对于 HTTP POST 请求,URL 指定资源,即strJenkinsURL = "http://&lt;jenkinsmaster&gt;/job/&lt;myjob&gt;/buildWithParameters

参数作为.Send 命令的一部分添加:

Dim sParams
sParams = "token=test&Description=" & strDesc & "&TestEnv=" & testEnv
HttpReq.Send(sParams)

正如@Lankymart 指出的那样,您还需要设置适当的标题,例如

HttpReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
HttpReq.setRequestHeader("Content-Length", CStr(Len(sParams)))

【讨论】:

  • 我实际上指的是您可能需要包含的授权特定标头,就像我在问题 cmets 上链接的 the example 一样。大多数 API 需要传递 API 密钥或用户名和密码 (通常是散列) 作为授权形式。
  • 这并不能解决问题。是的,我想添加 API 信息,但如何格式化它以便 Jenkins API 接受它?从其他 cmets,我添加了登录信息,但这并没有解决 403 crumb 问题。
  • @PondScum 你需要使用SetRequestHeader()添加登录信息,有一个完整的例子here
  • 是否添加了 .SetRequestHeader()。查看 Jenkins 返回的更新代码和响应。您参考的示例使用“X-Api-Key”和“”X-Auth-Token”,但我不知道这是否适用于 Jenkins,因为其他人已经说过用户名和密码。我找不到 Jenkins API 的 VBScript 示例.我在你的链接中找到了使用 --user USER:PASSWORD 和 --header 的 curl 示例,但没有任何内容显示 VBScript 中 Jenkins API 的正确键/值配对。到目前为止,Jenkins 文档也没有此信息据我所知。我已经阅读了我能找到的所有内容,但仍然没有运气。
【解决方案2】:

在将许多建议与一些试验和错误拼凑在一起后,我终于能够使用下面的 VBScript 代码远程运行 Jenkins 作业(变量设置为适当的值,例如 strCrumb)。返回的状态将为 201 表示成功。 Base64 函数取自Base64 Encode String in VBScript

Dim strJenkinsURL, strParam1, strParam2, strCrumb, strUsername, strPassword
strJenkinsURL = "https://<jenkinsURL>/job/testjob/buildWithParameters?token=test&param1="& strParam1 &"&param2="& strParam2

Set HttpReq = Server.CreateObject("MSXML2.ServerXMLHTTP")
HttpReq.Open "POST", strJenkinsURL, False
HttpReq.setOption 2, 13056
HttpReq.setRequestHeader "Jenkins-Crumb", strCrumb
HttpReq.setRequestHeader "Authorization", "Basic "& Base64Encode(strUsername &":"& strPassword)
HttpReq.Send
Response.Write "<br>Status: "& HttpReq.Status & vbNewline
Response.Write "<br>Response: "& HttpReq.responseText & vbNewline

Function Base64Encode(sText)
    Dim oXML, oNode
    Set oXML = CreateObject("Msxml2.DOMDocument.3.0")
    Set oNode = oXML.CreateElement("base64")
    oNode.dataType = "bin.base64"
    oNode.nodeTypedValue = Stream_StringToBinary(sText)
    Base64Encode = oNode.text
    Set oNode = Nothing
    Set oXML = Nothing
End Function

Private Function Stream_StringToBinary(Text)
    Const adTypeText = 2
    Const adTypeBinary = 1
    Dim BinaryStream 'As New Stream
    Set BinaryStream = CreateObject("ADODB.Stream")
    BinaryStream.Type = adTypeText
    BinaryStream.CharSet = "us-ascii"
    BinaryStream.Open
    BinaryStream.WriteText Text
    BinaryStream.Position = 0
    BinaryStream.Type = adTypeBinary
    BinaryStream.Position = 0
    Stream_StringToBinary = BinaryStream.Read
    Set BinaryStream = Nothing
End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多