在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配置中有什么变化?
答案 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
不知道为什么。