使用REST API获取Azure DevOps中的所有组织

13
我正在尝试检索我的帐户中的所有组织,但在文档中API调用始终需要一个组织。
https://dev.azure.com/{organization}/_apis/...
5个回答

13
如果您加载当前的登录页面,它将显示与您的帐户关联的所有组织。我认为它必须以某种方式获取该信息。我捕获了网络流量,并且我认为您可以使用系统API调用来获取所需的数据。但是,它可能会在没有通知的情况下更改或变得不受支持,因此请自行决定是否使用。
您可以使用此API获取所需的信息:
Post https://dev.azure.com/{organization1}/_apis/Contribution/HierarchyQuery?api-version=5.0-preview.1

正文:

{
    "contributionIds": ["ms.vss-features.my-organizations-data-provider"],
    "dataProviderContext":
        {
            "properties":{}
        }
}

回应:

{
    "dataProviderSharedData": {},
    "dataProviders": {
        "ms.vss-web.component-data": {},
        "ms.vss-web.shared-data": null,
        "ms.vss-features.my-organizations-data-provider": {
            "organizations": [
                {
                    "id": "{redacted id}",
                    "name": "{organization1}",
                    "url": "https://{organization1}.visualstudio.com/"
                },
                {
                    "id": "{redacted id}",
                    "name": "{organization2}",
                    "url": "https://dev.azure.com/{organization2}/"
                }
            ],
            "createNewOrgUrl": "https://app.vsaex.visualstudio.com/go/signup?account=true"
        }
    } }

非常好,它运行得很好!感谢您的分享。 - Kamil
请求中的{organization1}是什么?认证后,我只有一个可以用来进行API请求的令牌。我没有任何组织。我该如何获取第一个组织? - Andrew
它应该只是任何组织之一。我希望你至少要有一个。很可能默认情况下会是dev.azure.com/<这是组织名>后面的内容。 - Matt
你知道我需要为我的PAT提供什么权限范围来调用这个API吗? - Yogeesh Seralathan

6

您可以通过调用获取所有您是成员/所有者的帐户来简单地完成此操作。但是,需要您的ID才能实现这一点,它可以通过进行 get profile API 调用轻松获取。以下是步骤:

  1. 使用 Bearer token 或 PAT 进行 VSTS API 调用以获取个人资料详细信息

https://app.vssps.visualstudio.com/_apis/profile/profiles/me?api-version=5.1

这将返回您的 ID:

{
    "displayName": "xxxx",
    "publicAlias": "xxx",
    "emailAddress": "xxx",
    "coreRevision": xxx,
    "timeStamp": "2019-06-17T09:29:11.1917804+00:00",
    "id": "{{We need this}}",
    "revision": 298459751
}
  1. 接下来,调用API获取您是成员或拥有者的所有帐户:

https://app.vssps.visualstudio.com/_apis/accounts?api-version=5.1&memberId={{你的 Id}}

响应:

{
    "count": 1,
    "value": [
        {
            "accountId": "xxx",
            "accountUri": "xxx",
            "accountName": "xxx",
            "properties": {}
        }
    ]
}

它将返回您关联的账户列表。

使用个人访问令牌时,我的账户API可以正常工作,但是使用OAuth令牌时无法正常工作。 - Alon Amsalem

2

一个REST API的请求/响应可以分为五个组成部分:

请求URI,格式如下:

VERB https://{instance}[/{team-project}]/_apis[/{area}]/{resource}?api-version={version}

实例: 您发送请求的Azure DevOps Services组织或TFS服务器。
它们的结构如下: Azure DevOps Services:dev.azure.com/{organization} REST API是特定于组织的。目前尚未记录此内容。您可以在此处提交功能请求:https://developercommunity.visualstudio.com/spaces/21/index.html 我们的PM和产品团队将会审查您的建议。对此造成任何不便,敬请谅解。
作为解决方法,您可以使用从网络流量中捕获的API,就像Matt所提到的那样。
最初的回答。

1
我们一直在使用 "https://app.vssps.visualstudio.com/_apis/accounts",没有指定任何API版本,这将返回我们所有的帐户名称。
对我们来说,这仍然有效,但由于其他一些问题,我正在为所有API调用添加API版本。然而,因为https://learn.microsoft.com/en-us/rest/api/azure/devops/account/accounts/list?view=azure-devops-rest-5.0需要成员或所有者ID,所以我也遇到了一些困难。
检索需要一个帐户/组织,所以这是一个有点棘手的情况。
现在我想我会继续使用 "https://app.vssps.visualstudio.com/_apis/accounts"。

当我尝试调用“https://app.vssps.visualstudio.com/_apis/accounts”时,我收到了“远程服务器返回错误:(401)未经授权。”的错误。我正在使用WebClient和其他AzDO REST API请求的标准标头。 - CrazyIvan1974

-1

我同时收到了“app.vssps.visualstudio.com/_apis/accounts”和Post https://dev.azure.com/{organization1}/_apis/Contribution/HierarchyQuery?api-version=5.0-preview.1的登录响应。

状态码:203 状态描述:非权威信息

编辑: 没关系,使用静态MSA客户端ID和回复URL可以正常工作:

internal const string clientId = "872cd9fa-d31f-45e0-9eab-6e460a02d1f1";          //change to your app registration's Application ID, unless you are an MSA backed account
            internal const string replyUri = "urn:ietf:wg:oauth:2.0:oob";                     //change to your app registration's reply URI, unless you are an MSA backed account

 //PromptBehavior.RefreshSession will enforce an authn prompt every time. NOTE: Auto will take your windows login state if possible
            result = ctx.AcquireTokenAsync(azureDevOpsResourceId, clientId, new Uri(replyUri), promptBehavior).Result;
            Console.WriteLine("Token expires on: " + result.ExpiresOn);

            var bearerAuthHeader = new AuthenticationHeaderValue("Bearer", result.AccessToken);

// Headers
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Add("User-Agent", "ManagedClientConsoleAppSample");
            client.DefaultRequestHeaders.Add("X-TFS-FedAuthRedirect", "Suppress");
            client.DefaultRequestHeaders.Authorization = authHeader;


            //Get Organizations
            client.BaseAddress = new Uri("https://app.vssps.visualstudio.com/");
            HttpResponseMessage response1 = client.GetAsync("_apis/accounts").Result;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接