2017-07-24 69 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擴展與一個集線器和自定義端點。