5

我正在尝试使用仪表板小部件中 Microsoft VSTS SDK 的 REST API 在 TFS 2015 Update 3 服务器上获取所有现有构建定义:

VSS.init({                        
    explicitNotifyLoaded: true,
    usePlatformStyles: true
});

VSS.require("TFS/Dashboards/WidgetHelpers", "TFS/Build/RestClient", "VSS/Authentication/Services"],
    function (WidgetHelpers, TFS_Build_Api) {
    VSS.register("BuildStatusMonitor.Configuration", function () {

        return {
            load: function (widgetSettings, widgetConfigurationContext) {
                var buildClient = TFS_Build_Api.getClient();
                buildClient.getDefinitions().then(function(definition) {
                    //
                }, function(reason) {
                    // 401
                });
            },
        }
    });
    VSS.notifyLoadSucceeded();
});

不幸的是,我总是得到一个

TFS.WebApi.Exception:TF400813:资源不可用于匿名访问。需要客户端身份验证。

我究竟做错了什么?

当我在 chromes 开发者控制台上发送一个 get 请求时,我得到了正确的响应:=/

$.get("http://*****:8080/tfs/TestReporting/DashboardWidgets/_apis/build/definitions?api-version=2.2").success(function(res) { console.log(res) })

4

3 回答 3

0

您可能需要启用备用凭据。请参阅此链接:https ://binary-stuff.com/post/how-to-enable-alternate-credentials-in-visual-studio-online-vso

而且此链接对于以正确的方式设置身份验证非常有帮助:https ://www.visualstudio.com/en-us/docs/integrate/get-started/auth/overview

于 2016-08-23T02:06:52.207 回答
0

根据错误信息,您可能需要对 TFS REST API 进行身份验证。

VSTS 和 TFS 有不同的认证方式,都可以通过 PowerShell 来实现。

为了在脚本中使用 TFS 进行身份验证,您可以通过 PowerShell 将用户名密码(屏蔽为秘密变量)传递给PSCredential对象,并在调用 REST 方法时使用-Credential开关。一个例子如下:

$securePassword = $Password | ConvertTo-SecureString -AsPlainText -Force   $credential = New-Object System.Management.Automation.PSCredential($User, $securePassword)       
$releaseresponse = Invoke-RestMethod -Method Get -Credential $credential -ContentType application/json -Uri $Uri
于 2016-08-23T11:11:42.743 回答
0

当用户没有访问构建 rest-client 的权限时,替代方法是使用 PAT 身份验证。在使用 VSS-SDK 和 Typescript/Javascript 时,您可以使用以下技术来设置 PAT 身份验证。按照此处的步骤生成的 PAT直接粘贴到“{PAT}”中,没有“:”。

import service = require("VSS/Service");
import buildRestClient = require("TFS/Build/RestClient");
import { BuildHttpClient } from "TFS/Build/RestClient";
import { VssHttpClient } from "VSS/WebApi/RestClient";
import { BasicAuthTokenManager } from "VSS/Authentication/Services";

...

const buildClient: BuildHttpClient = 
                   service.getClient(buildRestClient.BuildHttpClient);
(buildClient as VssHttpClient).authTokenManager = 
                   new BasicAuthTokenManager("", "{PAT}");

// Subsequent calls will now use PAT authentication
const builds: Build[] = await buildClient.getBuilds(projectId);
于 2019-12-11T15:52:34.300 回答