使用 OAuth 和 PowerShell 更新 Azure DevOps Wiki 页面

2023-12-26

我正在尝试通过在 Azure DevOps 发布管道中创建新页面来自动创建发行说明使用其 Rest API 的 Azure DevOps wiki https://learn.microsoft.com/fr-fr/rest/api/azure/devops/wiki/pages/create%20or%20update?view=azure-devops-rest-5.0.

我遇到的问题是,我正在使用 PowerShell 脚本任务发布到 Rest API,并且我想避免使用个人访问令牌 (PAT) 和使用 OAuth 代替。 PAT 过期,我不希望 PAT 过期时所有版本突然失败。通过在构建代理的上下文中使用 OAuth 运行 PowerShell 脚本,我可以避免此过期问题。我在 PowerShell 脚本任务所在版本的代理作业中选中了“允许脚本访问 OAuth 令牌”。

为了简单起见,我正在运行以下命令inline用于测试使用 OAuth 创建新 wiki 页面的 PowerShell 脚本("Bearer $env:SYSTEM_ACCESSTOKEN"):

$uri = "https://dev.azure.com/{organization}/{project}/_apis/wiki/wikis/{wikiIdentifier}/pages?api-version=5.0&path=/Release%20Notes/Customers%20API/Release-299%20[Build:%2020191010.1]";

try {
    $response = Invoke-RestMethod `
    -Method PUT $uri `
    -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"} `
    -ContentType "application/json" `
    -Body $json
} catch {
    Write-Host "Message: " $_.Exception.Message;
    Write-Host "StatusCode: " $_.Exception.Response.StatusCode.value__ ;
    Write-Host "StatusDescription: " $_.Exception.Response.StatusDescription;
}

如果我使用 Postman 和个人访问令牌对上述 URL 执行 HTTP PUT,则新的 wiki 页面将成功创建。但是,如果我在 Azure DevOps 中的版本上下文中运行上述 PowerShell 脚本,我会收到 HTTP 400“错误请求”响应。我觉得这很奇怪,因为类似的 PowerShell 脚本任务可以查询 wiki 的 Rest API 是否存在页面而不会出现错误。

是否无法通过 wiki 的 Rest API 使用不记名令牌 (OAuth) 创建新的 Wiki 页面,或者我做错了什么?


是否无法使用不记名令牌创建新的 Wiki 页面 (OAuth) 通过 wiki 的 Rest API?

当然是的,这是可能的。您可以在本地使用 PAT 令牌执行的任何其余 api,都可以通过编程方式运行System.AccessToken在 Powershell 任务中。

对于您面临的错误,事实上,如果您只是Write-Host $response,错误消息会让你更清楚:

Invoke-RestMethod : {"$id":"1","innerException":null,"message":"The wiki page operation failed with message : User does not have write permissions for this  wiki.","typeName":"Microsoft.TeamFoundation.Wiki.Server.WikiPageOperationFailedException, 
Microsoft.TeamFoundation.Wiki.Server","typeKey":"WikiPageOperationFailedException","errorCode":0,"eventId":3000}

事实上,这是您需要关注的根本错误原因。

当你跑步时Rest api在Azure Devops pipeline中使用powershell任务,此时,该api的请求用户帐户为{项目名称}构建服务({组织名称})。换句话说,在构建期间请求添加 wiki 页面的用户是{项目名称}构建服务({组织名称}),这是一个构建服务帐户,权限范围仅在管道中。

此外,由于 Wiki 托管在存储库中,解决这个问题,你必须添加这个项目构建服务(组织名称)帐户进入您的存储库权限组,并确保其Contribute许可为Allow。因此这个构建服务帐户可以有足够的权限来添加wiki页面:

(Public 是我的项目名称,ForMerlin 是我的组织名称)


为了让您更清楚地了解您收到的原因400 Bad request error代替this non-permission error打印出来后$_.Exception.Message;$_.Exception.Response.StatusCode.value__ ; $_.Exception.Response.StatusDescription;,我重现了这个问题然后检查我们的后端IIS日志。

执行这个api的时候,实际上是服务端在调用Microsoft.TeamFoundation.Wiki.Web.Controllers.WikiPagesController.CreateOrUpdatePage打包“请求正文”这将发送到使用的下一个操作方法。 (Note:这个“请求体”与我们在rest API中使用的普通“请求体”不一样。这里我指的是已经完成的,也就是需要的服务器)。在其参数中,有一个可以代表用户的参数:callerName.

正如我之前提到的,调用此 API 请求的用户帐户是建立服务帐户,其权限范围不满足服务器要求。所以,服务器所需的这个“请求体”是无效的。然后你通过命令收到 400 代码$_.Exception.Response.StatusCode.value__.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 OAuth 和 PowerShell 更新 Azure DevOps Wiki 页面 的相关文章

随机推荐