首页 > 解决方案 > 在 Azure DevOps 中,列出生成定义 API 返回 401

问题描述

我正在使用 Python 来查询我们组织的 Azure Devops 服务器的 REST API。几个月来,我几乎可以查询每种类型的对象(项目、工作项、团队、迭代、成员等),但是当我尝试查询构建或构建定义时,我得到了 401。我正在使用我的对所有内容具有读取权限的人员访问令牌。这个令牌还没有过期,我可以通过仍然从我的所有其他 API 调用中获得成功的 200 个响应来证明。奇怪的是,我能够使用相同的令牌和基本身份验证从 Postman 获得 200 个结果。

这是我要访问的 URL:

https://{MYCOMPANY}.com:{PORT}/{COLLEGTION}/{PROJECT}/_apis/build/definitions

任何想法为什么这个 API URL 可能会有不同的行为?

标签: apirestazure-devops

解决方案


如果 url 通过 Postman 在同一台机器上运行良好,那么它也应该适用于您的 python 脚本。

您可以检查几点:

1.API版本。对于 TFS2018U2,它是 4.1,对于 Azure Devops Server 2019,它是 5.0。

2.Url,通常是这样的:

http://{tfsServerName}:8080/tfs/{CollectionName}/{ProjectName}/_apis/build/definitions?api-version=4.1

https除非在服务器上启用 SSL,否则不应使用。另外,请确保启用了基本身份验证。检查这个类似的

3.查看python代码,windows操作系统有两种认证方式:

Windows 身份验证和带有 PAT 的基本身份验证。

对于 Windows 身份验证,您可以使用这样的代码(来自Roopendra的提示):

import logging
import getpass
import requests
from requests_ntlm import HttpNtlmAuth

username = 'DomainName\\Administrator'
password = 'xxx'
tfsApi = 'http://xxx:8080/tfs/xxx/xxx/_apis/build/definitions?api-version=x.x'

tfsResponse = requests.get(tfsApi,auth=HttpNtlmAuth(username,password))
if(tfsResponse.ok):
    tfsResponse = tfsResponse.json()
    print(tfsResponse)
else:
    tfsResponse.raise_for_status()

对于带有 pat 的基本身份验证,您可以使用代码(来自Jack Jia的提示):

import requests
import base64

pat = 'acxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiq'
authorization = str(base64.b64encode(bytes(':'+pat, 'ascii')), 'ascii')

headers = {
    'Accept': 'application/json',
    'Authorization': 'Basic '+authorization
}

response = requests.get(
    url="http://MyServerName:8080/tfs/xxx/xxx/_apis/build/definitions?api-version=x.x", headers=headers)
print(response.text)

您也可以尝试创建一个新的 PAT 将完全访问用于测试目的...


推荐阅读