【问题标题】:Ajax calls to TFS 15 Rest Api stopped working after upgrade升级后对 TFS 15 Rest Api 的 Ajax 调用停止工作
【发布时间】:2017-03-04 20:05:34
【问题描述】:

在 TFS 2015 Update 3 中,一切正常运行。我曾经使用 npm 包 request 来使用所有 api,没有任何问题。 使用 jquery,以下调用也将始终正确完成:

//this used to work in 2015 Update 3
var request = {
  url: "https://my_server/tfs/DefaultCollection/_apis/projects?api-version=2.0",
  type:'GET',
  contentType: "application/json",
  accepts: "application/json",
  dataType: 'json',
  data: JSON.stringify(data),
  beforeSend: function (xhr) {
     xhr.setRequestHeader("Authorization", "Basic " + btoa("my_username:my_password"));
  }
};

$.ajax(request);

升级到 TFS 15 RC2 后,上述机制不再起作用。服务器总是返回 401 - Unauthorized 错误。

通过 curl 测试相同的调用,一切正常:

//this works well
curl -u my_username:my_password https://my_server/tfs/DefaultCollectiopis/projects?api-version=2.0

但是当我尝试在标头中发送凭据时再次失败,如下所示:

//this will fail
curl https://my_server/tfs/DefaultCollection/_apis/projects?api-version=2.0 \  
   -H "Accept: application/json" \
   -H "Authorization: Basic eNjPllEmF1emEuYmFuNppOUlOnVuZGVmaW5lZA=="

相同的 401 - 未经授权的错误。

我尝试设置我的个人访问令牌,因为它包含在 TFS 15 RC2 中,并按照here 指示进行测试

$( document ).ready(function() {
    $.ajax({
        url: 'https://my_server/defaultcollection/_apis/projects?api-version=2.0',
        dataType: 'json',
        headers: {
            'Authorization': 'Basic ' + btoa("" + ":" + myPatToken)
        }
    }).done(function( results ) {
        console.log( results.value[0].id + " " + results.value[0].name );
    });
});

它也失败了。但是,在将 myPatToken 替换为我的实际密码并传递我的用户名之后,请求成功完成:

//everything works correctly with the headers like this
headers: {
            'Authorization': 'Basic ' + btoa("my_username:my_password")
        }

简而言之,当我像这样(使用 jquery)设置标题时出了点问题:

//this fails
beforeSend: function (xhr) {
     xhr.setRequestHeader("Authorization", "Basic " + btoa("my_username:my_password"));
  }

看起来我正在使用的包 npm request 也可能使用了 beforeSend 属性或类似属性,但它失败了。

//this used to work with 2015 Update 3, not anymore after upgrading to 15 RC2
var options = {
            url: 'https://my_server/defaultcollection/_apis/projects?api-version=2.0',
            method:'GET',
            headers: {
                'Authorization': "Basic " + btoa("my_username:my_password")
            },
            json: data
      };

 request(options, (error, response, body) => {
      if (!error && response.statusCode == 200) {
          console.log(response);
      } else {
          console.log(error);
      }
  });

这让我觉得这可能是 IIS 配置中的问题,但基本身份验证配置正确。有没有办法让这个工作使用包请求? 升级后 IIS 配置发生了什么变化?

【问题讨论】:

    标签: tfs azure-devops tfs-2015 tfs-sdk


    【解决方案1】:

    重启服务器后问题得到解决,所以我猜我的情况是一个孤立的情况,与TFS本身无关。

    现在使用request 包发送请求似乎效果很好。

    但是,奇怪的是在浏览器中使用 jquery 测试它仍然失败。我注意到了

    var username = "my_username",
        password = "my_password";
    btoa(my_username + ":" + my_password); //generates wrong encoded string
    

    生成一个不同的编码字符串,然后简单地

    btoa("my_username:my_password") //generates right encoded string
    

    右边是少了几个字符,这是一个例子:

    eXVuaWQuYmZGV12lpmaW5lZA==  //wrong 
    eXVuaWQuYmZGVsbEAxMw==      //correct
    

    不知道为什么。

    【讨论】:

      猜你喜欢
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多