泽西岛客户端:詹金斯重定向时身份验证失败

时间:2020-03-03 12:07:09

标签: jenkins jersey jax-rs jersey-client

我正在尝试使用Jenkins的REST API。 Jenkins要求对URL进行POST请求才能删除作业。结果如下:

  1. 我告诉我选择的客户端将POST发送到相应的URL。
    客户端发送POST并使用用户名和密码授权自己。
  2. Jenkins删除作业。
  3. Jenkins返回“ 302-Found”,其中包含已删除作业的文件夹的位置。
  4. 客户端自动将POST发送到该位置。
  5. Jenkins回答“ 200-OK”和文件夹页面的完整HTML。

这对Postman来说很好用(当然,除非我禁用“自动跟随重定向”)。 但是,Jersey在第5步一直遇到“ 404”,因为我阻止了匿名用户查看该文件夹。 (如果我完全阻止了匿名用户,则为“ 403”。) 请注意,身份验证在步骤1中有效,因为作业已成功删除!

我的印象是,Jersey应该对所有与客户端有关的请求使用给定的身份验证。 有没有一种方法可以真正实现这一目标?我真的不想只为了自己做每个重定向而禁止重定向。

澄清一下:问题在于,尽管Jersey遵循了重定向,但是又无法再次对其进行身份验证,从而导致服务器拒绝了第二个请求。

有问题的代码:

HttpAuthenticationFeature auth = HttpAuthenticationFeature.basicBuilder()
    .credentials(username, token)
    .build();
Client client = ClientBuilder.newBuilder()
    .register(auth)
    .build();
WebTarget deleteTarget = client.target("http://[Jenkins-IP]/job/RestTestingArea/job/testJob/doDelete")  
Response response = deleteTarget.request()
    .post(null);

编辑:根据邮递员,“ 302-Found”只有5个标题:日期,X-Content-Type-Options(“ nosniff”),位置,Content-Length(0)和服务器。因此,Postman可能会使用的任何cookie或令牌都不会忽略Jersey。

this one松散相关的问题-如果我能够记录第二个请求,则我也许能够了解幕后发生的事情。

EDIT2 :我还确定问题显然出在身份验证上。如果我允许匿名用户查看有问题的文件夹,错误将消失并且服务器将回答200。

1 个答案:

答案 0 :(得分:1)

我在Paul SamsothaGautham的帮助下找到了答案。

TL; DR::这是预期的行为,您必须设置系统属性http.strictPostRedirect=true使其起作用,您自己执行第二个请求。< / p>


也如here所述,HttpURLConnection决定不实施HTTP标准中定义的重定向,而是由许多浏览器实施重定向(因此,通俗地说,“像其他人一样而不是应该如何工作”)。这导致以下行为:

  1. 将POST发送到URL_1。
  2. 服务器回答为“ 302-Found”,并包含URL_2。
  3. 将GET发送到URL_2,并删除所有标头
  4. 服务器回答为“ 404-Not Found”,因为第二个请求未包含正确的身份验证标头。
  5. “ 404”响应是代码收到的响应,因为步骤2和3被基础代码“隐藏”。

通过删除所有标头,身份验证失败。由于Jersey默认情况下使用此类,因此导致我遇到的行为。