Azure DevOps Rest API 创建个人访问令牌(PAT)-- patTokenError: userIdRequired
Azure DevOps Rest API 创建个人访问令牌(PAT)-- patTokenError: userIdRequired
使用GET动词时,我能够列出现有的PAT。
使用POST动词创建PAT时,我会收到一个200 OK的响应。
负载显示:
{"patToken":null,"patTokenError":"userIdRequired"}
这个错误在文档中有列出,但没有解释如何解决它。
var clientBearer = new RestClient(@"https://login.microsoftonline.com"); var requestBearer = new RestRequest($"{tenantID}/oauth2/v2.0/token"); requestBearer.AddHeader("Content-Type", "application/x-www-form-urlencoded"); requestBearer.AddParameter("client_id", appRegistration.appId); requestBearer.AddParameter("client_secret", appRegistrationSecret); requestBearer.AddParameter("scope", "499b84ac-1321-427f-aa17-267ca6975798/.default"); requestBearer.AddParameter("username", username); requestBearer.AddParameter("password", password); requestBearer.AddParameter("grant_type", "password"); var responseBearer = clientBearer.ExecutePostAsync(requestBearer).Result; var azureBearerToken = JsonConvert.DeserializeObject(responseBearer.Content); var devopsBearerToken = azureBearerToken.token_type + " " + azureBearerToken.access_token;
选择密码身份验证作为唯一可行的非互动身份验证方法。此用户正在替换ServicePrincipal/ManagedIdentity,因为Microsoft不支持这些模型用于Devops REST API,并且Azure CLI中不提供所有Devops REST API功能。
现在我有一个有效的Bearer令牌。
var devopsClient = new RestClient(@"https://vssps.dev.azure.com"); var patRequest = new RestRequest($"{devopsOrganization}/_apis/tokens/pats?api-version=7.1-preview.1"); patRequest.AddHeader("Authorization", devopsBearerToken); patRequest.AddHeader("Content-Type", "application/json"); var patListResponse = devopsClient.ExecuteGetAsync(patRequest).Result;
这个响应看起来很好,我知道Bearer令牌起作用了。由于这是通过Azure CLI创建的新的AD用户,我期望在响应中收到一个空的PAT数组,而我确实收到了。
到目前为止,一切顺利。
//创建一个令牌 var body = new { displayName = "targetName", scope = "app_token", validTo = validTo, allOrgs = true }; patRequest.AddJsonBody(body); var patCreateResponse = devopsClient.ExecutePostAsync(patRequest).Result;
这个最终的响应是问题所在,它包含了
patTokenError : userIdRequired
问题原因:UserIdRequired错误表明访问令牌中未提供UserId或用户未被允许。根据FAQ中的解释,可能是由于组织管理员在"https://dev.azure.com/{your-org-name}/_settings/organizationPolicy"上禁用了通过OAuth的第三方应用程序访问,或者在创建PAT时未在请求体中包含UserId。
解决方法:
1. 验证组织管理员是否禁用了通过OAuth的第三方应用程序访问,可通过访问"https://dev.azure.com/{your-org-name}/_settings/organizationPolicy"进行确认。
2. 尝试在创建PAT时在请求体中包含UserId,类似于"SO ref"中的示例。
3. 确保在Azure AD注册中为应用程序提供了正确的作用域(scope),以访问REST API并获得授权。用户可以通过访问用户的Azure AD租户并具有活动的Azure订阅来获取访问令牌,但如果缺乏访问Azure DevOps所需的适当权限,则用户可能无法通过REST API访问DevOps。
4. 根据Azure DevOps Services的Token Lifecycle Management REST API,令牌的作用域应为"499b84ac-1321-427f-aa17-267ca6975798/.default",该作用域提供对Azure DevOps Services REST API的访问。确保正确提供了作用域,并确保已授予管理员同意。
5. 对于其他PAT Token错误的情况,建议撤销该PAT。