【问题标题】:Jenkins json REST api with CORS request using jQuery使用jQuery的带有CORS请求的Jenkins json REST api
【发布时间】:2016-02-04 03:42:15
【问题描述】:

我正在尝试使用 Jenkins json API,但无法进行身份验证。

设置:

  • Jenkins 安全:Jenkin’s own user database
  • 访问:Matrix-gebaseerde beveiliging
  • CORS 通过Jenkins CORS plugin
  • 使用注册用户的用户名/api 令牌

试过了:

var username = "username";
var apiToken = "apiToken";

// username / api-token on url (basic authentication)
$.ajax({
  url: "http://"+username+":"+apiToken+"@host:port/job/test/api/json",
  method: "GET"
});

// username / api-token supplied using jQuery's username/password properties
$.ajax({
  url: "http://host:port/job/test/api/json",
  method: "GET",
  username: username,
  password: apiToken
});

// username / api-token by setting "Authorization" header directly
$.ajax({
  url: "http://host:port/job/test/api/json",
  method: "GET",
  headers: {
      "Authorization": "Basic " + btoa(username + ":" + apiToken)
  }
});

所有这些尝试都会产生相同的结果: 响应:403 禁止

【问题讨论】:

  • 没有。对不起。你有任何线索
  • 刚刚发布了一个可能的答案

标签: jquery json rest jenkins cors


【解决方案1】:

回应@nick 提供的答案:

我已使用 Jenkins Cors Filter Plugin 添加所需的 CORS 标头:

Access-Control-Allow-Origins: http://mydomain
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Authorization

@nick 的解决方案要求你在同一个浏览器中进行身份验证。
为了通过 REST 调用提供凭据,我添加了一个 "Authorization" header,如下所示:

$.ajax({
  url:'https://myserver.com/job/MYJOB/lastBuild/api/json',
  method: 'GET',
  headers: {'Authorization': 'Basic ' + btoa('username:apitoken')}
}).done(function(data) {
  console.log(data);
}).fail(function() {
  console.error(arguments);
});

apitoken 可以通过特定用户的配置来检索,以便在 Jenkins 本身中使用。

【讨论】:

  • 我安装了那个插件,但它似乎没有做任何事情。要么与 jenkins 需要重新启动有关(我们当时有很多工作无法杀死),要么 nginx 代理可能已经将它们过滤掉了?!无论哪种方式,这就是我将标头放在 nginx 代理中的原因。
【解决方案2】:

我在这方面取得了一些成功。注意:我必须在我们的 nginx 代理配置中添加两个 add_header 行...

add_header Access-Control-Allow-Origin 'http://localhost:9001';
add_header Access-Control-Allow-Credentials 'true';

然后我可以在 Jenkins 中执行此操作。只要我的浏览器在另一个选项卡中获得授权(共享相同的会话/cookie),似乎不需要任何用户/通行证/令牌。

$.ajax({
  url:'https://myserver.com/job/MYJOB/lastBuild/api/json',
  method: 'GET',
  xhrFields: {
    withCredentials: true
  }
}).done(function(data) {
  console.log(data);
}).fail(function() {
  console.error(arguments);
});

【讨论】:

  • 我会试一试,让你知道(下周?)。
  • 成功了!谢谢!正如您已经说过的,您必须在同一个浏览器中进行身份验证。为了完全验证,您可以使用: headers: {'Authorization': 'Basic ' + btoa('username:apiToken')}
猜你喜欢
  • 2017-03-19
  • 2019-12-01
  • 2015-02-27
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
相关资源
最近更新 更多