Ajax调用TFS 15 Rest Api在升级后停止工作

时间:2016-10-22 17:07:48

标签: tfs azure-devops tfs2015 tfs-sdk

在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 - 未授权错误。

通过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配置中有什么变化?

1 个答案:

答案 0 :(得分:0)

重新启动服务器后问题得到解决,所以我猜我的情况是一个孤立的情况,与自己的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

不知道为什么。