2017-07-24 68 views
0

我正在为TFS构建一个集线器扩展,它将与HP Fortify REST API联系并返回项目列表。 TFS服务器和Fortify服务器都在同一个域内运行。为Team Foundation Server扩展配置CORS

Fortify的具有配置,其中IIS 8.5的一个独特的排序是前端到Tomcat 8

我想要做的第一件事情是从TFS分机的呼叫,以获得令牌来自Fortify。充分披露,我是一个JavaScript新手,所以这可能不是真棒:

$.ajax({ 
    type: "POST", 
    url: "https://fortifyserver/ssc/api/v1/auth/obtain_token", 
    data: JSON.stringify({ name: "Teambuild" }), 
    contentType: "application/json", 
    beforeSend: function (xhr) { 
    xhr.setRequestHeader("Accept", "application/json, text/plain, */*"); 
    xhr.setRequestHeader("Content-type", "text/plain"); 
    xhr.setRequestHeader("Content-Encoding", "gzip"); 
    xhr.setRequestHeader("Cache-Control", "no-cache"); 
    xhr.setRequestHeader("Authorization", "Basic ********************");      
    }, 
    dataType: "json", 
    success: function (data) { 
    alert("Data Loaded: " + data); 
    } 
}); 

当上面的脚本执行,我得到这个错误:

Failed to load resource: the server responded with a status of 401 (Unauthorized) 

XMLHttpRequest cannot load https://fortifyserver/ssc/api/v1/auth/obtain_token. Response for preflight has invalid HTTP status code 401 

我敢肯定这是CORS相关的,所以我的问题是Fortify配置的哪一部分应该调整? IIS或Tomcat或两者?

+0

来自Fortify代表:看起来有一个CORS支持的现有增强请求,并且 没有可用时间的目标日期。 – AspiringTFSGuru

+0

鉴于新发现的知识,我将考虑代理CORS请求。如果有效,我会将解决方案作为我的答案发布。 – AspiringTFSGuru

+0

我也了解到Fortify不支持jsonp,所以我的选择变得非常有限。 – AspiringTFSGuru

回答

0

我想出了一个替代方法来做到这一点。我根据Sriram Balasubramaniam的这一系列blog posts的指导为HP Fortify Rest API创建了自定义服务端点。

我还使用jsonpath online evaluator来帮助找出我的自定义扩展中每个数据源的正确结果语法。这是一个什么样的数据源看起来像是为端点的例子:

"dataSources": [     
       { 
        "name": "GetAllProjects", 
        "endpointUrl": "$(endpoint.url)api/v1/projects", 
        "resultSelector": "jsonpath:$.data.[*]" 
       } 
      ] 

这里是一个AJAX调用的例子消费端点:

var queryUri = baseUri + '/_apis/distributedtask/serviceendpointproxy?endpointId=' + $connectionDropdown.val() + '&api-version=3.0-preview.1';       
var projectQueryContent = '{"dataSourceDetails": {"dataSourceName":"GetAllProjects"}}'; 

         $.ajax({ 
           type: "POST", 
           url: queryUri, 
           data: projectQueryContent, 
           contentType: 'application/json', 
           dataType: 'json', 
           headers: { 'Authorization': basicAuthHeader } 
          }) 
           .done(function (data) { 
            $(data.result).each(function (i, e) { 
            var el = JSON.parse(e); 
            //console.log('Project Name: ' + el.name); 
            $projectDropdown.append($('<option value="' + el.id + '">' + el.name + '</option>')); 
            });            

           }); 

现在我有一个VSTS/TFS扩展与一个集线器和自定义端点。